場景

#

如果您正在將 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