标题Flutter与Android混编
在Android与Flutter混编中导入flutter的GetX框架时,配置getPages参数出错,在编译时不报错,但是运行之后,debug模式下出现红底白色的错误,错误显示为 Null check operator used on a null value,看一眼懵了,本地开发版本使用的是flutter2,配置的Getx库也确实在很早的版本中就支持了Null safety ,且配置的getPages为数组并且可为空,按照常理怎么也不可能出现这个错误!
尝试的方案
1.老三件套删除Build、清除缓存、删除flutter中的pub缓存文件,无用!
2.GetMaterialApp中传入getPages参数为空数组,结果还是报错
3.不使用GetMaterialApp,使用原生的MaterialApp,正常,说明不是缓存的原因啊
4.降低GetX版本,在支持空数组和不支持的版本间疯狂切换,效果还是一样
百度上的结果也是没多少的,可能混编的情况还是不太多,没有太多的参考!
于是我尝试在一个纯flutter项目中去加载GetX并配置getPages,发现竟然可以运行,一模一样的的flutter环境,运行的结果竟然不同,于是我确定了不是flutter环境的锅,想到混编的话是通过FlutterEngine引擎去加载,问题会不会出在这里呢!
创建FlutterEngine代码
/**创建FlutterEngine*/
flutterEngine = createFlutterEngine()
GeneratedPluginRegistrant.registerWith(flutterEngine!!)
val flutterFragment = FlutterFragment.withCachedEngine(engineId)
.renderMode(RenderMode.surface)
.build<FlutterFragment>()
/**将FlutterFragment添加到FrameLayout中*/
supportFragmentManager
.beginTransaction()
.add(R.id.fl_container, flutterFragment)
.commit()
/**
* 创建可缓存的FlutterEngine
* FlutterEngine可加速启动Flutter引擎,快速启动页面
* @return [FlutterEngine]
*/
private fun createFlutterEngine(): FlutterEngine {
/** 实例化FlutterEngine对象*/
val flutterEngine = FlutterEngine(this)
/** 设置初始路由 */
flutterEngine.navigationChannel.setInitialRoute(
"route_page"
)
/** 开始执行dart代码来pre-warm FlutterEngine */
flutterEngine.dartExecutor.executeDartEntrypoint(
DartExecutor.DartEntrypoint.createDefault()
)
/** 缓存FlutterEngine */
FlutterEngineCache.getInstance().put(engineId, flutterEngine)
return flutterEngine
}
在创建FlutterEngine中,我使用了FlutterEngineCache进行缓存,通过engineId为键值缓存起来后,下次进入会在withCachedEngine中进行读取,但是奇怪的是,每次运行APP都会杀死,难道APP杀死后,FlutterEngineCache中的FlutterEngine还在内存中?难道它是由系统进行创建并维护的?有知道的小伙伴可以留言告诉我,后期也会去研究一下FlutterEngine!
解决问题
去除FlutterEngineCache,每次进入时创建一个默认的新的FlutterEngine,不再从缓存中读取
supportFragmentManager
.beginTransaction()
.add(R.id.fl_container, FlutterFragment.createDefault())
.commit()
问题解决,但是为啥清理后台之后,缓存还是存在呢?知道的小伙伴留言告诉我!