前言
Flutter 模块的开发已经告一段落,是时候总结一下有关的问题与一些技术点了;希望可以帮注意一些人
上干货
1.问题: Flutter 在打包正式环境时不显示本地资源文
解决方法: Flutter混编项目打包正式环境时需要注释掉 gradle 文件里面的 ‘debuggable true’ 属性,否则保存在本地文件中的资源文件会打包不进去 (android)
2.问题: Flutter嵌入到fragment中是头部的appBar无法正常显示
解决方法: 使用 PreferredSize() 部件,自定义appBar部件,可以配置 preferredSize 属性用来控制appBar的高度
3.问题: TextEditingController()(文本编辑控制器) 方法用来控制输入框的输入内容,在更新输入内容的时候直接清空页面的数据
解决方法: 将控制器提升为页面全局变量,并且写在 Widget build(BuildContext context) 方法之外,用为控制器会刷新build 方法里面的数据,导致页面清空
4.问题: TextField 在数据过多的时候不会像原生中自动换行
解决方法: 需要设定属性maxLines,用来设定换行
5.问题: 使用 Row 部件,将三个小部件横向摆列,但是输入部件不展示
解决方法: 具体的展示,需要将输入小部件用 Flexible() 部件包裹
扩展:Flexible组件可以使Row、Column、Flex等子组件在主轴方向有填充可用空间的能力,与Expanded组件不同,它不强制子组件填充可用空间。Row、Column、Flex会被Expanded撑开,充满主轴可用空间。
6.Flutter 传值方法,官方提供的方法是使用Flutter.createView(),然后建立通信通道,但是目前新版的Flutter sdk 已经不支持这种方式了,android这边用的是Flutter_Boost方法 原生Nativity 使用FlutterBoost.instance().channel().sendEvent(“name”, map) Flutter用FlutterBoost.singleton.channel.addEventListener(name, (name, arguments) => null) 进行监听,双方需要保证 name一致。
7.Flutter 官方提供了 WillPopScope 小部件进行拦截系统的返回键,但是在混编情况下,Flutter嵌入到Fragment中时,无法使用,因为会被fragment的父Activity拦截,所以需要单独处理;使用通信的方式用来销毁 weight
8.原生跳转使用Flutter_Boost 因为在原生跳转到Flutter 中会创建FlutterViewController,每次跳转都会重新创建新的FlutterViewController,导致内存使用上升,很短时间就会让App崩溃;Flutter_Boost的概念就是只保留一个FlutterViewController,原生的处理方法暂时未深扒;
9.由于引擎的绘制不同,导致flutter的页面生命周期并没有合适的回调/代理等来触发,不要想着didUpdateWidget或者Dependency里来做些奇怪的请求刷新.
唯一可以做的好像就只有在initState里做完所有事情;
这里就讲点虚的,所以所有的操作需要严格从动作触发,而不要是再从页面级别触发了,
举个例子
android: button点击 -> 跳转 -> 返回 -> onRestart刷新全页
Flutter: button点击 -> 刷新对应的Widget -> 跳转
10.android 原生中的资源文件都是保存到res下的文件夹中,在Flutter中需要手动的添加images 文件夹,并且需要再pubspec.yaml 文件中挨个引入,才可以使用
举例:
flutter:
assets:
- assets/my_icon.png
- assets/background.png
11.Flutter 在和android 混编的情况下,如果嵌入的是在Activity中 那么无论跳转多少个weight,都是在嵌入的Activity中,嵌入的Fragment,也只是在那个Fragment里面,在android的栈中,跳转的这些weight都只是一个页面.
12.在创建新的Flutter Moudle 模块时,如果SDK 比较古老的话,就会在Gradle-wrapper.properties文件中 导入distributionUrl=https://services.gradle.org/distributions/gradle-4.10.0-all.zip 的这个文件,注意这个文件需要更换成最新的,或者5.0以上的版本,4.10.0这个版本是android support 库使用的,现在已经全面升级到androidX 版本.
13.Flutter 混编的包,在debug环境下会比较大,打包relase正式环境时会比较小,主要原因是因为在开发的时候,Flutter 提供了Hot reload热加载以及快速编译的功能(因为不像原生可以预览);正式环境的时候Flutter采用AOT策略,只打包必须的资源,所以包的体积缩小了很多
14.在Flutter 与 Android混编的过程中,需要在android的清单文件中加上允许运行网络的权限,否则会报错 Unhandled Exception: SocketException: Failed host lookup 不过Flutter的报错是页面红屏并把错误展示在页面上,算是在应用内崩溃,并不会出现闪退,Flutter应用如果闪退应该是发生了内存泄漏,并把内存占满被系统强制关闭,防止内存泄漏的方式尽量不要在页面被销毁前强制调用上下文对象;具体的更多方式参考闲鱼团队文章 https://www.yuque.com/xytech/flutter/iomeb2
15.在Android Studio 中打开pubspec.yaml文件会一直卡顿的原因,是因为下载了Flutter intl插件,这个插件会一直更新 yaml 文件中的内容,并且在打开的时候就进行检测,是否有新的库加入,导致 AS 有的时候会被卡住,甚至卡死机
16.更新了最新版的android studio 后,在控制台执行 flutter doctor 命令会检测不到在studio 中安装的Flutter 插件 以及Dart 插件,不需要去管这里的错误,因为android stdio 在4.1之后就更换了安装路径,Flutter检测不到导致;但实际可以正常使用,也可以添加软链接,ln -s~/Library/Application\ Support/Google/AndroidStudio4.1/plugins ~/Library/Application\ Support/AndroidStudio4.1,再次执行 flutter doctor 检测通过
持续更新…