当前位置:   article > 正文

flutter 开发踩坑集_flutter base64 存本地

flutter base64 存本地

一、 TextField设置高度后,文字无法居中

解决方案:

  1. TextField(
  2. style: TextStyle(
  3. ),
  4. decoration: InputDecoration(
  5. prefixIcon: ImageUtils.getImage("search")/*Icon(Icons.search)*/,
  6. hintText: widget.hint,
  7. fillColor: Color(0xfff1f1f2),
  8. contentPadding: EdgeInsets.all(0),//设置输入内容垂直居中
  9. border: OutlineInputBorder(
  10. borderSide: BorderSide.none,
  11. // borderRadius: BorderRadius.circular(20)
  12. ),
  13. ),
  14. )
  1. 设置decoration属性,在InputDecoration中设置contentPadding: EdgeInsets.all(0),
  2. 在InputDecoration中设置border属性,不能直接设置InputBorder.none,否则还是不能居中。

二、项目使用window.physicalSize和设定尺寸作比来做适配,奇怪的某些界面偶现的错乱问题

解决方案:(我的是由于项目中使用了隐藏导航栏await SystemChrome.setEnabledSystemUIOverlays([]);的原因,可能还有其他的因素会影响到window.physicalSize的获取计算问题),

  1. void main() async {
  2. return SentryUtil.wrap(() async {
  3. WidgetsFlutterBinding.ensureInitialized();
  4. await SystemChrome.setPreferredOrientations(
  5. [DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]);
  6. if (Platform.isIOS) {
  7. await ScreenRotationiOS.changeScreenOrientation(
  8. DeviceOrientationMask.Landscape);
  9. }
  10. Devices.init(width: 1080, height: 810);
  11. runApp(MyApp(
  12. appRoutes: routes,
  13. home: HomeScreen(),
  14. ));
  15. //这个需要放置在runApp后,不影响项目内部的window.physicalSize的获取
  16. await SystemChrome.setEnabledSystemUIOverlays([]);
  17. }, dsn: kDebugMode ? null : sentryDsn);
  18. }

 //这个需要放置在runApp后,不影响项目内部的window.physicalSize的获取
    await SystemChrome.setEnabledSystemUIOverlays([]);

三、点击空白触发取消键盘

FocusScope.of(context).requestFocus(FocusNode());

四、软键盘把界面底部顶起,不让界面底部自动升起

  1. Scaffold(
  2. resizeToAvoidBottomPadding: false,
  3. )

五、合并多个流做为一个stream

  1. //yaml引入依赖 async
  2. //使用StreamGroup.merge()
  3. StreamBuilder(
  4. stream: StreamGroup.merge(_streams),
  5. builder:....,)

六、flutter在用??的时候要小心,

 下面这两个结果返回是不一样的哦,只有dataValue是null或者0的时候返回结果才是一样的!!

  1. (dataValue ?? 0 / 60)
  2. //
  3. ((dataValue ?? 0) / 60)

七、base64转为图片保存本地或者转为unit8list

  1. class FileUtil {
  2.  
  3.   static Future<String> createFileFromString(String base64Str) async {
  4.     Uint8List bytes = base64.decode(base64Str);
  5.     String dir = (await getApplicationDocumentsDirectory()).path;
  6.     File file = File("$dir/" + DateTime.now().millisecondsSinceEpoch.toString() + ".png");
  7.     await file.writeAsBytes(bytes);
  8.     return file.path;
  9.   }
  10.  
  11. }

八、flutter之前的版本是2.2.3,升级到下一版本2.5.0之后出现之前的textfield基本组件使用报错异常问题:以及对应的修改调整如下:

 九、clipper参数定义裁剪规则说明

十、多级for循环,里面的beak打破的是最小的for循环么?还是所有的for循环。

十一、Flutter路由里面用routename相同的两个,不相邻。进入和退出第二个相同routename的页面路由记录和页面显示如何?

 home ->MultiPageOne->MultiPageTwo(1)->MultiPageThree->MultiPageTwo(2)->MultiPageFour

1.返回到MultiPageTwo(2)可以pop,可以poputil通过之前的路由跳转的route.settings.name == MultiPageTwo.routeName。

  1. Navigator.popUntil(context, (route) {
  2. return route.settings.name == MultiPageTwo.routeName;
  3. }),

2.返回到MultiPageTwo(1),还需要通过前面的settings.arguments参数加上做限制。

  1. Navigator.popUntil(context, (route) {
  2. return route.settings.name == MultiPageTwo.routeName &&
  3. route.settings.arguments == MultiPageOne.routeName;
  4. })

十二、Border是在container的外层还是在内层,还是一半内层一般外层。

  1. Container(
  2. width: 60,
  3. height: 60,
  4. color: Colors.red,
  5. clipBehavior: Clip.none,
  6. alignment: Alignment.center,
  7. child: Container(
  8. width: 56,
  9. height: 56,
  10. clipBehavior: Clip.none,
  11. decoration: BoxDecoration(
  12. border: Border.all(
  13. width: 10, color: Colors.orange.withOpacity(0.5)),
  14. color: Colors.cyan.withOpacity(0.5),
  15. ),
  16. ),
  17. )

看结果是在container的内层

十三、 flutter执行帧动画,使用Image.asset(),来加载(尤其是资源多或者大的图片),动画卡顿。

可使用Image(),通过ImageProvider来将资源提前加入的方式操作,可解。

  1. AnimatedBuilder(
  2. animation: controller.xingxAnimation,
  3. builder: (context, child) {
  4. var index = controller.xingxAnimation.value.round();
  5. return Image(
  6. //controller.girlImagesProviders是帧动画的所有图片的ImageProvider的数组,
  7. image: controller.girlImagesProviders[index],
  8. width: 306.ratio,
  9. height: 396.ratio,
  10. //gaplessPlayback默认false,设置为true,可避免切换加载间的闪动(加载中的显示模式)
  11. gaplessPlayback: true,
  12. );
  13. },
  14. ),

十四、column中第一行有一个tab选择器,结果在iOS设备上面无法点击。下面的其他元素可以点击,查看图层没有遮挡,手势也正确使用。

经查看,发现是最外层页面根布局为Scaffold,其中加载的列表根布局也是Scaffold,导致了这个问题的出现。(解决方法:删除子元素的scaffold使用)

保证Scaffold仅在最外层,避免嵌套。

根本原因scaffold内部根据平台时iOS和macos有一个手势丢弃处理:

所以解决方案可以有三种:

1.在父组件外面套一层SafeArea(这样顶部会有边距,不是我想要的)

2.子组件不使用Scaffold(但同时也会失去floatbutton属性)

3.子组件Scaffold外层套一个MediaQuery.removePadding,把顶部空间移除掉

  1. MediaQuery.removePadding(
  2. context: context,
  3. removeTop: true,
  4. child: Scaffold(
  5. backgroundColor: Colors.white,
  6. floatingActionButton: _floatingBtn(),
  7. body: _initSubviews(),
  8. ),
  9. )

十五、

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/268760?site
推荐阅读
相关标签
  

闽ICP备14008679号