多個 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