多个 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 上下文、字体指标和 isolate 组快照,从而实现更快的初始渲染延迟和更低的内存占用。
从
FlutterEngineGroup
派生的FlutterEngine
可以像正常构造的缓存FlutterEngine
一样,用于连接到 UI 类,如FlutterActivity
或FlutterViewController
。从
FlutterEngineGroup
派生的第一个FlutterEngine
不需要继续存活,以便后续的FlutterEngine
共享资源,只要任何时候至少有一个FlutterEngine
存活即可。从
FlutterEngineGroup
创建第一个FlutterEngine
具有与之前使用构造函数构造FlutterEngine
相同的 性能特征。当
FlutterEngineGroup
的所有FlutterEngine
都被销毁时,下一个创建的FlutterEngine
具有与第一个引擎相同的性能特征。FlutterEngineGroup
本身不需要在其衍生的引擎全部销毁后继续存在。销毁FlutterEngineGroup
不会影响已衍生的FlutterEngine
,但会移除创建与现有衍生引擎共享资源的额外FlutterEngine
的能力。
通信
#Flutter 实例之间的通信通过宿主平台使用 平台通道(或 Pigeon)进行处理。要查看我们关于通信的路线图,或关于增强多个 Flutter 实例的其他计划工作,请查看 Issue 72009。
示例
#您可以在 GitHub 上找到一个演示如何在 Android 和 iOS 上使用 FlutterEngineGroup
的示例。
