多个 Flutter 页面或视图
使用场景
#如果你正在将 Flutter 集成到现有应用,或者正在将原生应用逐渐迁移到使用 Flutter,你可能会需要在一个工程中添加多个 Flutter 实例,特别是在下述场景下,多 Flutter 实例可能更为有用:
-
集成了 Flutter 界面的应用,其位置并不在路由栈的叶子节点上,且其可能是混合路由栈,即 native -> Flutter -> native -> Flutter。
-
多个 Flutter view 同时集成在同一个页面上,且同时显示。
使用多个 Flutter 实例的优势在于,每一个实例互相独立,各自维护路由栈、UI 和应用状态。这简化了应用程序整体的状态保持考虑,并且进一步模块化。了解更多关于多个 Flutter 使用的动机和场景,请查看 RFC 文档: Multiple Flutters。
Flutter 针对多 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 相关的类,例如FlutterActivity
或FlutterViewController
,与通常构造缓存的FlutterEngine
类似。 -
第一个
FlutterEngineGroup
生成的FlutterEngine
不需要持续保活,只要有 1 个可用的FlutterEngine
,就可以随时在各个FlutterEngine
之间共享资源。 -
通过
FlutterEngineGroup
生成的首个FlutterEngine
与使用先前的构造方法构造的FlutterEngine
有相同的性能特征。 -
当所有由
FlutterEngineGroup
构造的FlutterEngine
都被销毁后,下一个创建的FlutterEngine
与首个创造的性能特征相同。 -
FlutterEngineGroup
本身不需要持续保活。将其销毁后,已生成的FlutterEngine
不受影响,但无法继续在现有共享的基础上创建新引擎。
实例之间相互通讯
#多个 Flutter 实例之间相互通讯可以通过 平台通道 或者 Pigeon 进行。可以在 Issue 72009 里查阅我们关于多 Flutter 实例通讯和增强功能计划的路线图。
示例
#你可以在 GitHub 仓库 上找到在 Android 和 iOS 上使用 FlutterEngineGroup
的示例。
除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-05-20。 查看文档源码 或者 为本页面内容提出建议。