场景

#

如果您正在将 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 APIiOS API)来构造 FlutterEngine,而不是之前使用的 FlutterEngine 构造函数。

虽然 FlutterEngine API 直接且更易于使用,但从同一个 FlutterEngineGroup 派生的 FlutterEngine 具有性能优势,可以共享许多通用、可重用的资源,例如 GPU 上下文、字体指标和 isolate 组快照,从而实现更快的初始渲染延迟和更低的内存占用。

  • FlutterEngineGroup 派生的 FlutterEngine 可以像正常构造的缓存 FlutterEngine 一样,用于连接到 UI 类,如 FlutterActivityFlutterViewController

  • FlutterEngineGroup 派生的第一个 FlutterEngine 不需要继续存活,以便后续的 FlutterEngine 共享资源,只要任何时候至少有一个 FlutterEngine 存活即可。

  • FlutterEngineGroup 创建第一个 FlutterEngine 具有与之前使用构造函数构造 FlutterEngine 相同的 性能特征

  • FlutterEngineGroup 的所有 FlutterEngine 都被销毁时,下一个创建的 FlutterEngine 具有与第一个引擎相同的性能特征。

  • FlutterEngineGroup 本身不需要在其衍生的引擎全部销毁后继续存在。销毁 FlutterEngineGroup 不会影响已衍生的 FlutterEngine,但会移除创建与现有衍生引擎共享资源的额外 FlutterEngine 的能力。

通信

#

Flutter 实例之间的通信通过宿主平台使用 平台通道(或 Pigeon)进行处理。要查看我们关于通信的路线图,或关于增强多个 Flutter 实例的其他计划工作,请查看 Issue 72009

示例

#

您可以在 GitHub 上找到一个演示如何在 Android 和 iOS 上使用 FlutterEngineGroup 的示例。

A sample demonstrating multiple-Flutters