0
点赞
收藏
分享

微信扫一扫

Flutter 2,android编程权威指南第四版

黎轩的闲暇时光 2022-01-30 阅读 228

image.png

但是官方提供的方案,就意味着这个设计得到了 Flutter 官方的保证,在未来的版本中会有兼容的优势

FlutterEngineGroup 方案使用了多 Engine 混合模式,官方宣称除了一个 Engine 对象之外,后续每个 Engine 对象在 Android 和 iOS 上仅占用 180kB

从 Flutter 官方提供的例子上看,FlutterEngineGroup 的 API 十分简单,多个 Engine 实例的内部都是独立维护自己的内部导航堆栈,所以可以做到每个 Engine 对应一个独立的模块。

所以使用 FlutterEngineGroup 之后,FlutterEngine 都将由 FlutterEngineGroup 去生成,生成的 FlutterEngine 可以独立应用于 FlutterActivity/FlutterViewController,甚至是 FlutterFragment

这其实得益于通过 FlutterEngineGroup 生成的 FlutterEngine 可以共享 GPU 上下文, font metrics 和 isolate group snapshot ,从而实现了更快的初始速度和更低的内存占用。

简单的使用介绍

使用 FlutterEngineGroup 首先需要创建一个 FlutterEngineGroup 单例对象,之后每当需要创建 Engine 时,就通过它的 createAndRunEngine(activity, dartEntrypoint) 来创建对应的 FlutterEngine

val app = activity.applicationContext as App
// This has to be lazy to avoid creation before the FlutterEngineGroup.
val dartEntrypoint =
DartExecutor.DartEntrypoint(
FlutterInjector.instance().flutterLoader().findAppBundlePath(), entrypoint
)
engine = app.engines.createAndRunEngine(activity, dartEntrypoint)
this.delegate = delegate
channel = MethodChannel(engine.dartExecutor.binaryMessenger, “multiple-flutters”)

以官方 Demo 的这段代码为例子:

1、首先通过 findAppBundlePathentrypoint 创建出 DartEntrypoint 对象,这里的 findAppBundlePath 主要就是默认的 flutter_assets 目录;而 entrypoint 其实就是 dart 代码里启动方法的名称;也就是绑定了在 dart 中 runApp 的方法。

///kotlin
app.engines.createAndRunEngine(pathToBundle, “topMain”)

///dart
@pragma(‘vm:entry-point’)
void topMain() => runApp(MyApp());

2、通过上面创建的 dartEntrypointcontext ,使用 FlutterEngineGroup 就可以创建出对应的 FlutterEngine ,其实在内部就是通过FlutterJNI.nativeSpawn![](https://www.hualigs.cn/image/61dba891ed8ee.jpg) 和原有的引擎交互,得到新的 Long 地址 id。

3、最后利用生成的 FlutterEnginebinaryMessenger 来得到一个 MethodChannel 用于原生和 dart 之间的通信。

binaryMessenger 来得到一个 MethodChannel 用于原生和 dart 之间的通信。

举报

相关推荐

0 条评论