跳到主內容

多個 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 一樣,用於連線到諸如 FlutterActivityFlutterViewController 等 UI 類。

  • 只要始終至少有一個活動的 FlutterEngine,從 FlutterEngineGroup 派生的第一個 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