将 Flutter 视图添加到 Android 应用
通过 FlutterView 集成需要比前面描述的 FlutterActivity 和 FlutterFragment 更多一些工作。
从根本上讲,Dart 端的 Flutter 框架需要访问各种活动级事件和生命周期才能运行。由于 FlutterView(它是一个 android.view.View)可以添加到开发者的应用程序拥有的任何活动中,并且由于 FlutterView 无法访问活动级事件,因此开发者必须手动将这些连接桥接到 FlutterEngine。
选择将应用程序的活动事件提供给 FlutterView 的方式将取决于你的应用程序。
示例
与 FlutterActivity 和 FlutterFragment 的指南不同,FlutterView 集成可以通过示例项目更好地展示。
示例项目位于 https://github.com/flutter/samples/tree/main/add-to-app/android_view,用于记录简单的 FlutterView 集成,其中 FlutterView 用于 RecycleView 卡片列表中的一些单元格,如上方的动图所示。
一般方法
FlutterView 级集成的总体要点是,你必须在自己的应用程序代码中重新创建 FlutterView、FlutterEngine 和 FlutterActivityAndFragmentDelegate 中存在的 Activity、FlutterView 和 FlutterEngine 之间的各种交互。在使用 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 叠加、插件等)的正确运行。