多个 Flutter 屏幕或视图
场景
#如果你正在将 Flutter 集成到现有应用中,或逐渐将现有应用迁移到使用 Flutter,你可能会发现自己想要向同一个项目中添加多个 Flutter 实例。特别是,这在以下场景中非常有用:
- 一个应用,其中集成的 Flutter 屏幕不是导航图的叶子节点,并且导航堆栈可能是原生 -> Flutter -> 原生 -> Flutter 的混合组合。
- 一个屏幕,其中可能集成了多个部分屏幕的 Flutter 视图,并且同时可见。
使用多个 Flutter 实例的优势在于,每个实例都是独立的,并维护其自己的内部导航堆栈、UI 和应用程序状态。这简化了应用程序代码在状态维护方面的整体职责,并提高了模块化程度。有关促使使用多个 Flutter 的场景的更多详细信息,请参见 flutter.dev/go/multiple-flutters。
Flutter 针对此场景进行了优化,添加其他 Flutter 实例的增量内存成本很低(约 180kB)。这种固定成本的降低允许在您的添加到应用集成中更自由地使用多个 Flutter 实例模式。
组件
#在 Android 和 iOS 上添加多个 Flutter 实例的主要 API 基于一个新的 FlutterEngineGroup
类(Android API,iOS API)来构造 FlutterEngine
,而不是以前使用的 FlutterEngine
构造函数。
虽然 FlutterEngine
API 更直接且易于使用,但从同一 FlutterEngineGroup
生成的 FlutterEngine
具有共享许多常见可重用资源(例如 GPU 上下文、字体指标和隔离组快照)的性能优势,从而导致更快的初始渲染延迟和更低的内存占用。
从
FlutterEngineGroup
生成的FlutterEngine
可以像通常构造的缓存FlutterEngine
一样用于连接到 UI 类,例如FlutterActivity
或FlutterViewController
。只要始终至少存在一个活动的
FlutterEngine
,则从FlutterEngineGroup
生成的第一个FlutterEngine
不需要继续存活以供后续FlutterEngine
共享资源。从
FlutterEngineGroup
创建第一个FlutterEngine
具有与以前使用构造函数构造FlutterEngine
相同的 性能特征。当
FlutterEngineGroup
中的所有FlutterEngine
都被销毁时,接下来创建的FlutterEngine
具有与第一个引擎相同的性能特征。FlutterEngineGroup
本身不需要在所有生成的引擎之外继续存活。销毁FlutterEngineGroup
不会影响现有的已生成FlutterEngine
,但会删除生成其他与现有已生成引擎共享资源的FlutterEngine
的能力。
通信
#Flutter 实例之间的通信是通过主机平台使用 平台通道(或 Pigeon)处理的。要查看我们关于通信的路线图或其他计划中关于增强多个 Flutter 实例的工作,请查看 Issue 72009。
示例
#您可以在 GitHub 上找到一个示例,演示如何在 Android 和 iOS 上使用 FlutterEngineGroup
。
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面上次更新于 2024-05-08。 查看源代码 或 报告问题。