多个 Flutter 页面或视图

使用场景

如果你正在将 Flutter 集成到现有应用,或者正在将原生应用逐渐迁移到使用 Flutter,你可能会需要在一个工程中添加多个 Flutter 实例,特别是在下述场景下,多 Flutter 实例可能更为有用:

  • 集成了 Flutter 界面的应用,其位置并不在路由栈的叶子节点上,且其可能是混合路由栈,即 native -> Flutter -> native -> Flutter。

  • 多个 Flutter view 同时集成在同一个页面上,且同时显示。

使用多个 Flutter 实例的优势在于,每一个实例互相独立,各自维护路由栈、UI 和应用状态。这简化了应用程序整体的状态保持考虑,并且进一步模块化。了解更多关于多个 Flutter 使用的动机和场景,请查看 RFC 文档: Multiple Flutters

Flutter 2 以及以上的版本针对多 Flutter 实例进行了优化,额外增加的 Flutter 实例只会增加约 180K 的内存占用,这种「固定成本」的降低,可以帮助你更轻松的将 Flutter 加入到现有应用 (add-to-app)。

组件

在 Android 和 iOS 上添加多个 Flutter 实例的主要 API 是基于新的 FlutterEngineGroup 类 (Android API, iOS API) 来创建 FlutterEngine 的,而不是通过以前的 FlutterEngine 构造。

尽管 FlutterEngine API 的用法简洁明了,但从 FlutterEngineGroup 生成的 FlutterEngine 具有常用共享资源(例如 GPU 上下文、字体度量和隔离线程的快照)的性能优势,从而加快首次渲染的速度、降低延迟并降低内存占用。

  • FlutterEngineGroup 生成的 FlutterEngine 可以用来关联 UI 相关的类,例如 FlutterActivityFlutterViewController,与通常构造缓存的 FlutterEngine 类似。

  • 第一个 FlutterEngineGroup 生成的 FlutterEngine 不需要持续保活,只要有 1 个可用的 FlutterEngine,就可以随时在各个 FlutterEngine 之间共享资源。

  • 通过 FlutterEngineGroup 生成的首个 FlutterEngine 与使用先前的构造方法构造的 FlutterEngine 有相同的性能特征

  • 当所有由 FlutterEngineGroup 构造的 FlutterEngine 都被销毁后,下一个创建的 FlutterEngine 与首个创造的性能特征相同。

  • FlutterEngineGroup 本身不需要持续保活。将其销毁后,已生成的 FlutterEngine 不受影响,但无法继续在现有共享的基础上创建新引擎。

实例之间相互通讯

多个 Flutter 实例之间相互通讯可以通过 平台通道 或者 Pigeon 进行。可以在 Issue 72009 里查阅我们关于多 Flutter 实例通讯和增强功能计划的路线图。

示例

您可以在 GitHub 仓库 上找到在 Android 和 iOS 上使用 FlutterEngineGroup 的示例。

A sample demonstrating multiple-Flutters