Skip to main content

多个 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 APIiOS API)来构造 FlutterEngine,而不是以前使用的 FlutterEngine 构造函数。

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

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

  • 只要始终至少存在 1 个活动的 FlutterEngine,从 FlutterEngineGroup 生成的第一个 FlutterEngine 不需要继续存在才能使后续的 FlutterEngine 共享资源。

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

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

  • FlutterEngineGroup 本身不需要在所有生成的引擎之后继续存在。销毁 FlutterEngineGroup 不会影响现有的已生成的 FlutterEngine,但会删除生成其他 FlutterEngine 的能力,这些 FlutterEngine 与现有的已生成的引擎共享资源。

通信

#

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

示例

#

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

A sample demonstrating multiple-Flutters