将 Flutter View 添加到 Android 应用
与前面描述的通过 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 集成,其中 FlutterView 用于 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
可见时,调用appIsResumed
在FlutterEngine
的lifecycleChannel
字段上。
当 FlutterView
或 Activity
不再可见时,还必须调用相反的 detachFromFlutterEngine
和 LifecycleChannel
类上的其他生命周期方法,以免资源泄露。
此外,请参阅 FlutterViewEngine
演示类或 FlutterActivityAndFragmentDelegate
中的其余实现,以确保剪贴板、系统 UI 叠加、插件等其他功能的正确运行。