多個 Flutter 螢幕或檢視
如何將多個 Flutter 引擎、螢幕或檢視例項整合到你的應用中。
應用場景
#如果你正在將 Flutter 整合到現有應用中,或者正在逐步將現有應用遷移到 Flutter,你可能希望在同一個專案中新增多個 Flutter 例項。這在以下場景中尤其有用:
- 整合後的 Flutter 螢幕不是導航圖的葉子節點,且導航堆疊可能是原生 -> Flutter -> 原生 -> Flutter 的混合模式。
- 在同一個螢幕上需要同時整合並顯示多個部分螢幕的 Flutter 檢視。
使用多個 Flutter 例項的優勢在於,每個例項都是獨立的,並維護其自己的內部導航堆疊、UI 和應用狀態。這簡化了整個應用程式碼在狀態保持方面的職責,並提高了模組化程度。有關促使使用多個 Flutter 例項的場景的更多詳細資訊,請訪問 flutter.dev/go/multiple-flutters。
Flutter 針對此場景進行了最佳化,新增額外 Flutter 例項的增量記憶體成本很低(約 180kB)。這種固定成本的降低使得多 Flutter 例項模式可以在你的 Add-to-app 整合中更自由地使用。
元件
#在 Android 和 iOS 上新增多個 Flutter 例項的主要 API 基於新的 FlutterEngineGroup 類(Android API, iOS API)來構建 FlutterEngine,而不是以前使用的 FlutterEngine 建構函式。
雖然 FlutterEngine API 直接且更易於使用,但由同一個 FlutterEngineGroup 派生出的 FlutterEngine 具有共享許多通用且可重用資源(如 GPU 上下文、字型指標和 isolate 組快照)的效能優勢,從而實現更快的初始渲染延遲和更低的記憶體佔用。
-
由
FlutterEngineGroup派生出的FlutterEngine可以像通常構造的快取FlutterEngine一樣,用於連線到諸如FlutterActivity或FlutterViewController等 UI 類。 -
只要始終至少有一個活動的
FlutterEngine,從FlutterEngineGroup派生的第一個FlutterEngine不需要一直保持存活,後續的FlutterEngine即可共享資源。 -
從
FlutterEngineGroup建立第一個FlutterEngine與之前使用建構函式構建FlutterEngine具有相同的效能特徵。 -
當來自同一個
FlutterEngineGroup的所有FlutterEngine都被銷燬後,下一個建立的FlutterEngine將具有與第一個引擎相同的效能特徵。 -
FlutterEngineGroup本身不需要在所有派生的引擎生命週期結束後才銷燬。銷燬FlutterEngineGroup不會影響現有的派生FlutterEngine,但會失去生成能與現有引擎共享資源的新FlutterEngine的能力。
通訊
#Flutter 例項之間的通訊透過宿主平臺使用 平臺通道(或 Pigeon)進行處理。要檢視我們在通訊方面的路線圖,或其他有關增強多個 Flutter 例項的計劃工作,請查閱 Issue 72009。
示例
#你可以在 GitHub 上找到一個演示如何在 Android 和 iOS 上使用 FlutterEngineGroup 的示例。