多個 Flutter 螢幕或視圖
使用情境
#如果您正在將 Flutter 整合到現有應用程式中, 或是逐步將現有應用程式遷移至 Flutter, 您可能會希望在同一個專案中加入多個 Flutter 實例。這在以下情境中特別有用:
- 應用程式中,整合的 Flutter 螢幕不是導覽圖的葉節點, 導覽堆疊可能是原生 -> Flutter -> 原生 -> Flutter 的混合結構。
- 某個螢幕同時整合並顯示多個部分螢幕的 Flutter 視圖。
使用多個 Flutter 實例的優點在於,每個 實例都是獨立的,並維護自己的內部導覽堆疊、UI 及應用程式狀態。 這簡化了整體應用程式程式碼對狀態管理的責任,並提升模組化程度。 有關多個 Flutter 實例使用動機的更多細節,請參考 flutter.dev/go/multiple-flutters。
Flutter 已針對這種情境進行最佳化,新增額外 Flutter 實例的 增量記憶體成本很低(約 180kB)。 這個固定成本的降低,使您在 add-to-app 整合時能更靈活地採用多個 Flutter 實例的模式。
元件
#在 Android 與 iOS 上新增多個 Flutter 實例的主要 API 是基於新的 FlutterEngineGroup 類別(Android API、iOS API), 用來建立 FlutterEngine,而非先前使用的 FlutterEngine 建構子。
雖然 FlutterEngine API 較為直接且易於使用, 但由同一個 FlutterEngineGroup 派生的 FlutterEngine 具有效能上的優勢,能共享許多常用、可重複利用的資源,例如 GPU context、字型度量及 isolate group snapshot,帶來更快的初次渲染延遲與更低的記憶體佔用。
由
FlutterEngineGroup派生的FlutterEngine可用於連接 UI 類別,例如FlutterActivity或FlutterViewController, 其方式與一般建構的快取FlutterEngine相同。從
FlutterEngineGroup派生的第一個FlutterEngine不需要持續存活,只要任何時刻至少有一個存活的FlutterEngine, 後續的FlutterEngine仍可共享資源。從
FlutterEngineGroup建立的第一個FlutterEngine, 其效能特性與先前使用建構子建立FlutterEngine相同。當來自同一
FlutterEngineGroup的所有FlutterEngine都被銷毀後, 下一個建立的FlutterEngine會與最初建立引擎時有相同的效能特性。FlutterEngineGroup本身不需要比所有已派生的引擎存活更久。 銷毀FlutterEngineGroup不會影響現有已派生的FlutterEngine, 但會失去派生更多可與現有引擎共享資源的FlutterEngine的能力。
溝通
#Flutter 實例之間的溝通是透過平台通道 (or Pigeon),經由主機平台來處理。如需查看我們在溝通上的規劃藍圖, 或其他關於增強多個 Flutter 實例的計畫,請參考 Issue 72009。
範例
#您可以在 GitHub 上找到同時展示如何在 Android 與 iOS 使用 FlutterEngineGroup 的範例。