这不是一篇教程,只是在使用过程中的一些问题记录
安装创建时遇到的问题
module模版语言指定问题
flutter create --template module --ios-language swift --android-language kotlin --project-name zsa_module flutter_zsa
在选择模版为module时实际上是指定不了语言的,使用android studio也会提醒
flutter doctor报错cmdline-tools component is missing
解决途径是安装cmd-tool,可以通过studio下的android sdk安装
编码问题
flutterviewcontroller内存泄漏
编码时,发现flutterviewcontroller在pop返回后,没有走deinit方法,使用flutterenginegroup以及flutterengine均会出现. 每次进入flutter页面,内存都会暴涨100多mb且不会降低,随便进入几次轻轻松松四五百兆,这是一个很致命的问题,甚至让我产生了直接放弃flutter的想法,在注释所有有可能影响的代码后,怀疑是flutter sdk问题,于是在github上查找
不止一条issue指出flutterviewcontroller在3.10.1~3.10.5版本期间会产生内存泄漏,这一问题一直到昨天才被修复,并且执行没有发布release版本。于是我只能降flutter版本到3.7.12 果然能够正常释放flutterviewcontroller。
flutterviewcontroller内存占用过高
原生app中嵌入flutter,我们肯定想做的是一个flutter单独成页面,做到原生-flutter-原生-flutter,基于这种需求,flutter为我们提供了flutterenginegroup这个类,可以通过group获取engine,并指定initialRoute,实现后返现在第一次进入flutter页面时,内存增长100mb,再通过原生进入新的flutter页面,内存增加20mb多左右,确实可以做到不会大规模增长内存,在退出所有flutter页面后,内存回归到原生时的内存大小,可以正常使用。但是每次重新进入flutter页面会,会重新初始化大概一百多兆的flutter引擎,体验也并不算太好
flutter与原生交互时机
三种flutter与原生交互方式都是一样的,这里以fluttermethodchannel举例,原生端初始化一个channel,flutter端也初始化一个channel,正常是原生在channel创建完后,向flutter端传递必要的数据,比如userToken,userId,host,http加密key等等,但是如果直接传递会有一个问题,就是传递时机过快导致flutter初始化channel都没完成,从而接受不到该数据。这里可以约定了一个通信消息,比如 flutter channel初始化完成通知原生开始传递数据
这样就可以实现数据初始化的稳定
module编译,及原生项目引入
这里的问题是,module项目与原生项目其实是两个项目,在不同的文件夹下。
而module项目依赖原生的项目传递用户token进行请求,但module不能直接使用原生项目通过flutter run -d *** module模块项目执行的run运行的是flutter项目下.ios文件夹下的项目,并不是我们原生的项目
所以这里有一个问题就是,我们想要利用flutter的hot reload进行快速编码,目前只能通过手动赋值,然后先在flutter模块项目中编写完,然后通过pod install安装依赖到我们的原生项目中,然后编写原生项目的交互代码,最后进行代码调试。我个人感觉这样的操作其实很不优雅,我最想要的是,flutter开发的模块,通过flutter run直接运行到原生的项目中,这样编写的效率是最快的
总体看来,原生项目嵌入flutter项目,目前看是可行的,但是总感觉flutter官方并不太重视,不然也不会3.10.1~3.10.5的最新稳定版都出现flutterviewcontroller内存泄漏而一直没有解决,还有flutterenginegroup不知能否提供个选项,可以选择保持engine中的内存持有,这样不必在完全退出engine后,需要重新初始化engine。 好处也是有的,比如可以统一一些不重要的页面,原生项目中,我们iOS使用的语言很杂,UI框架体系也不尽相同,有oc,swift,snapkit,flexlayout,frame布局等等,每个项目基本都得自己手动去写布局及逻辑,但是需求上大体是相同的,还有android更不用说了,原生嵌入flutter,很大部分与原生依赖程度不高的页面,都可以用flutter去写完,然后稍微做下适配即可,编码效率肯定是大大提高,只需要做好相关的规范即可。