在 Android 應用中新增 Flutter 檢視
與之前描述的透過 FlutterActivity 和 FlutterFragment 整合相比,透過 FlutterView 整合需要更多的工作。
從根本上說,Dart 端的 Flutter 框架需要訪問各種 Activity 級別的事件和生命週期才能正常執行。由於 FlutterView(它是一個 android.view.View)可以新增到開發者應用程式擁有的任何 Activity 中,並且 FlutterView 無法訪問 Activity 級別的事件,因此開發者必須手動將這些連線橋接到 FlutterEngine。
你選擇如何將應用程式 Activity 的事件傳遞給 FlutterView 將取決於你的應用程式。
示例
#
與 FlutterActivity 和 FlutterFragment 的指南不同,FlutterView 整合最好透過示例專案來演示。
示例專案位於 https://github.com/flutter/samples/tree/main/add_to_app/android_view,用於記錄簡單的 FlutterView 整合,其中 FlutterViews 用於 RecycleView 卡片列表中的某些單元格,如上面的 GIF 所示。
通用方法
#FlutterView 級別整合的總體思路是,你必須在自己的應用程式程式碼中重新建立 Activity、FlutterView 和 FlutterEngine 之間各種互動,這些互動存在於 FlutterActivityAndFragmentDelegate 中。當使用 FlutterActivity 或 FlutterFragment 時,FlutterActivityAndFragmentDelegate 中的連線會自動完成,但由於在這種情況下 FlutterView 被新增到你的應用程式的 Activity 或 Fragment 中,你必須手動重新建立連線。否則,FlutterView 將不會渲染任何內容或缺少其他功能。
一個名為 FlutterViewEngine 的示例類展示了一個可能的實現,用於連線 Activity、FlutterView 和 FlutterEngine 之間的特定於應用程式的連線。
要實現的 API
#Flutter 能夠渲染任何內容所需的最低限度實現是:
- 在
FlutterView被新增到已恢復的Activity的檢視層級且可見時,呼叫attachToFlutterEngine;以及 - 在託管
FlutterView的Activity可見時,在FlutterEngine的lifecycleChannel欄位上呼叫appIsResumed。
當 FlutterView 或 Activity 不再可見時,為了避免資源洩露,還必須呼叫反向的 detachFromFlutterEngine 以及 LifecycleChannel 類上的其他生命週期方法。
此外,請參閱 FlutterViewEngine 演示類或 FlutterActivityAndFragmentDelegate 中的其餘實現,以確保剪貼簿、系統 UI 疊加層、外掛等其他功能的正確執行。