多個 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 相關的類,例如FlutterActivity
或FlutterViewController
,與通常構造快取的FlutterEngine
類似。 -
第一個
FlutterEngineGroup
產生的FlutterEngine
不需要持續保活,只要有 1 個可用的FlutterEngine
,就可以隨時在各個FlutterEngine
之間共享資源。 -
透過
FlutterEngineGroup
產生的首個FlutterEngine
與使用先前的構造方法構造的FlutterEngine
有相同的效能特徵。 -
當所有由
FlutterEngineGroup
構造的FlutterEngine
都被銷燬後,下一個建立的FlutterEngine
與首個創造的效能特徵相同。 -
FlutterEngineGroup
本身不需要持續保活。將其銷燬後,已產生的FlutterEngine
不受影響,但無法繼續在現有共享的基礎上建立新引擎。
例項之間相互通訊
多個 Flutter 例項之間相互通訊可以透過 平台通道 或者 Pigeon 進行。可以在 Issue 72009 裡查閱我們關於多 Flutter 例項通訊和增強功能計劃的路線圖。
範例
您可以在 GitHub 儲存庫 上找到在 Android 和 iOS 上使用 FlutterEngineGroup
的範例。
