Flutter混合开发-Null check operator used on a null value

标题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()

问题解决,但是为啥清理后台之后,缓存还是存在呢?知道的小伙伴留言告诉我!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值