多个 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
可用于连接到 UI 类,如FlutterActivity
或FlutterViewController
,方式与通常构建的缓存FlutterEngine
相同。 -
从
FlutterEngineGroup
生成的第一个FlutterEngine
无需继续存在,以便后续FlutterEngine
共享资源,只要始终至少有 1 个活动的FlutterEngine
即可。 -
从
FlutterEngineGroup
创建第一个FlutterEngine
与使用构造函数构建FlutterEngine
具有相同的 性能特征。 -
当
FlutterEngineGroup
中的所有FlutterEngine
都被销毁时,创建的下一个FlutterEngine
具有与第一个引擎相同的性能特征。 -
FlutterEngineGroup
本身无需在所有生成的引擎之后继续存在。销毁FlutterEngineGroup
不会影响现有的已生成的FlutterEngine
,但会移除生成其他与现有已生成引擎共享资源的FlutterEngine
的能力。
通信
Flutter 实例之间的通信通过主机平台使用平台通道(或Pigeon)进行处理。如需查看我们的通信路线图或其他计划用于增强多个 Flutter 实例的工作,请查看问题 72009。
示例
您可以在GitHub上找到一个示例,演示如何在 Android 和 iOS 上使用FlutterEngineGroup
。