多个 Flutter 屏幕或视图
如何将多个 Flutter 引擎、屏幕或视图实例集成到你的应用中。
应用场景
#如果你正在将 Flutter 集成到现有应用中,或者正在逐步将现有应用迁移到 Flutter,你可能希望在同一个项目中添加多个 Flutter 实例。这在以下场景中尤其有用:
- 集成后的 Flutter 屏幕不是导航图的叶子节点,且导航堆栈可能是原生 -> Flutter -> 原生 -> Flutter 的混合模式。
- 在同一个屏幕上需要同时集成并显示多个部分屏幕的 Flutter 视图。
使用多个 Flutter 实例的优势在于,每个实例都是独立的,并维护其自己的内部导航堆栈、UI 和应用状态。这简化了整个应用代码在状态保持方面的职责,并提高了模块化程度。有关促使使用多个 Flutter 实例的场景的更多详细信息,请访问 flutter.dev/go/multiple-flutters。
Flutter 针对此场景进行了优化,添加额外 Flutter 实例的增量内存成本很低(约 180kB)。这种固定成本的降低使得多 Flutter 实例模式可以在你的 Add-to-app 集成中更自由地使用。
组件
#在 Android 和 iOS 上添加多个 Flutter 实例的主要 API 基于新的 FlutterEngineGroup 类(Android API, iOS API)来构建 FlutterEngine,而不是以前使用的 FlutterEngine 构造函数。
虽然 FlutterEngine API 直接且更易于使用,但由同一个 FlutterEngineGroup 派生出的 FlutterEngine 具有共享许多通用且可重用资源(如 GPU 上下文、字体指标和 isolate 组快照)的性能优势,从而实现更快的初始渲染延迟和更低的内存占用。
-
由
FlutterEngineGroup派生出的FlutterEngine可以像通常构造的缓存FlutterEngine一样,用于连接到诸如FlutterActivity或FlutterViewController等 UI 类。 -
只要始终至少有一个活动的
FlutterEngine,从FlutterEngineGroup派生的第一个FlutterEngine不需要一直保持存活,后续的FlutterEngine即可共享资源。 -
从
FlutterEngineGroup创建第一个FlutterEngine与之前使用构造函数构建FlutterEngine具有相同的性能特征。 -
当来自同一个
FlutterEngineGroup的所有FlutterEngine都被销毁后,下一个创建的FlutterEngine将具有与第一个引擎相同的性能特征。 -
FlutterEngineGroup本身不需要在所有派生的引擎生命周期结束后才销毁。销毁FlutterEngineGroup不会影响现有的派生FlutterEngine,但会失去生成能与现有引擎共享资源的新FlutterEngine的能力。
通信
#Flutter 实例之间的通信通过宿主平台使用 平台通道(或 Pigeon)进行处理。要查看我们在通信方面的路线图,或其他有关增强多个 Flutter 实例的计划工作,请查阅 Issue 72009。
示例
#你可以在 GitHub 上找到一个演示如何在 Android 和 iOS 上使用 FlutterEngineGroup 的示例。