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