Flutter Engine预加载分析

预加载的好处:

加快Flutter页面的打开速度。

预加载的原因:

因为每个打开的Flutter页面,默认情况下都需要创建一个Flutter Engine,这个初始化是比较耗时的,所以可以考虑提前初始化一个Flutter Engine并保存起来,后续可以省去初始化的时间而直接使用。

预加载的实现:

以android端为例,ios基本类似

//在应用初始化时,执行如下代码,创建一个flutter engine,并以一个key值保存起来。
// Instantiate a FlutterEngine.
    flutterEngine = FlutterEngine(this)

    // Start executing Dart code to pre-warm the FlutterEngine.
    flutterEngine.dartExecutor.executeDartEntrypoint(
      DartExecutor.DartEntrypoint.createDefault()
    )

    // Cache the FlutterEngine to be used by FlutterActivity.
    FlutterEngineCache
      .getInstance()
      .put("my_engine_id", flutterEngine)
  }

当需要打开FlutterActivity时,通过如下方法进行调用

 startActivity(
    FlutterActivity
      .withCachedEngine("my_engine_id")
      .build(this)
  )

如果不使用预加载的flutter engine,调用方式如下:

 startActivity(
         FlutterActivity
             .withNewEngine()
             .initialRoute("初始化路由")
             .build(context)
     )

上述两种方式除了是否使用预加载的flutter engine之外,第二种方式还能指定初始化的路由,这一点非常关键,因为通过指定路由能决定显示哪个页面,正是因为这一点导致无法在少儿词典中进行flutter engine的预加载。

预加载的限制

当创建一个预加载的flutter engine时,必须指定是加载的路由,如果不指定的话,就会加载默认的根路由。这样导致,当你使用预加载的flutter engine时,是无法重新定义路由的。

预加载的使用场景

1、希望预加载的页面路由必须是固定的,如果某些参数是通过初始化路由带到flutter侧的,那么这些参数在预加载flutter engine之前必须是确定的。
2、预加载的页面最好是对打开速度要求较高的页面,譬如首页。如果将其他一些优先级不是很高的页面提前预加载,反而会影响应用启动速度。

总结

少儿词典项目不引入预加载flutter engine的方案。
因为少儿词典内的flutter页面做了一个基础的封装,所有的flutter页面都会通过统一的入口来打开,打开的同时,还会将一些动态的初始化参数以initroute字符串的方式传递到flutter侧。这就意味着每次打开flutter页面都会传递参数,都需要设置initroute,这与预加载flutter engine的api是相冲突的。
少儿词典这样设计的好处在于,方便原生和前端的协作,相互之间只需要定义一个路由和参数名,就可以搭建好双端的通信协议,可以提高开发效率。

参考资料链接:https://flutter.dev/docs/development/add-to-app/android/project-setup

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值