【问题标题】:What is the difference between Flutter Android Embedding V1 and V2Flutter Android Embedding V1 和 V2 有什么区别
【发布时间】:2020-05-16 04:44:44
【问题描述】:
我正在开发一个带有背景内容的 Flutter 插件。
最近,我在android_alarm_manager 插件中遇到了一些关于 Flutter android embedding 的问题。
README 的一部分说:
对于 Flutter Android Embedding V1,必须为后台服务提供回调,以便向后台隔离注册插件。
-
Flutter android embedding V1 还是 V2 到底是什么?
- 这两者有什么区别?
【问题讨论】:
标签:
android
flutter
dart
flutter-android
android-embedded-api
【解决方案1】:
-
Flutter 发布了其 Android 嵌入的新版本。这是负责将 Flutter 集成到 Android 应用程序中的 Android 代码。它包括 FlutterActivity、FlutterFragment、FlutterView 和 FlutterEngine 等类。 v2 Android 嵌入包括对标准 Android 生命周期事件的支持以及 Flutter 执行与 Android UI 的分离,这些在 v1 Android 嵌入中是缺失的。在 v2 Android 嵌入的开发过程中,很明显,现有的 Flutter 插件 API 不足以处理 v2 Android 嵌入的新功能。需要一个新的 Android 插件 API。
-
在旧的 v1 Android 嵌入中,所有插件都在 Android 应用程序的一开始就被初始化和配置,并且只有一次 Flutter 体验。在 v2 嵌入中,我们不假设插件何时初始化,并且插件必须在每个 FlutterEngine 中初始化一次。因此,所有适用于 Android 的 Flutter 插件现在必须支持实例化而不是静态初始化,并且它们必须支持附加到 FlutterEngine 和从 FlutterEngine 分离。以下代码示例演示了旧 v1 插件初始化实现和新 v2 插件初始化过程之间的区别。
旧插件初始化
class MyOldPlugin {
public static void registerWith(PluginRegistrar registrar) {
// Obtain any references that the plugin requires from the
// registrar.
//
// This plugin is now considered "initialized" and "attached"
// to a Flutter experience.
}
}
新插件初始化
class MyNewPlugin implements FlutterPlugin {
public MyNewPlugin() {
// All Android plugin classes must support a no-args
// constructor. A no-arg constructor is provided by
// default without declaring one, but we include it here for
// clarity.
//
// At this point your plugin is instantiated, but it
// isn't attached to any Flutter experience. You should not
// attempt to do any work here that is related to obtaining
// resources or manipulating Flutter.
}
@override
public void onAttachedToFlutterEngine(FlutterPluginBinding binding) {
// Your plugin is now attached to a Flutter experience
// represented by the given FlutterEngine.
//
// You can obtain the associated FlutterEngine with
// binding.getFlutterEngine()
//
// You can obtain a BinaryMessenger with
// binding.getBinaryMessenger()
//
// You can obtain the Application context with
// binding.getApplicationContext()
//
// You cannot access an Activity here because this
// FlutterEngine is not necessarily displayed within an
// Activity. See the ActivityAware interface for more info.
}
@override
public void onDetachedFromFlutterEngine(FlutterPluginBinding binding) {
// Your plugin is no longer attached to a Flutter experience.
// You need to clean up any resources and references that you
// established in onAttachedToFlutterEngine().
}
}
此外,您的插件不得依赖 onAttachedToFlutterEngine() 中的 Activity 引用。仅仅因为您的插件附加到 Flutter 体验并不意味着 Flutter 体验正在显示在 Activity 中。 这是新旧插件 API 之间最显着的区别之一。在旧的 v1 插件 API 中,插件作者可以依赖 Activity 立即且永久可用。这不再是真的。
欲了解更多信息,请参阅https://medium.com/flutter/modern-flutter-plugin-development-4c3ee015cf5a
【讨论】:
-
完全不清楚这个答案的全部内容是从end中提到的链接复制和粘贴的。阅读文档本身将提供更多上下文。
【解决方案2】:
根据docs:
为了更好地支持将 Flutter 添加到现有项目的执行环境,现在不推荐使用在 io.flutter.app.FlutterActivity 托管 Flutter 运行时的旧 Android 平台端包装器及其相关类。 io.flutter.embedding.android.FlutterActivity 和相关类的新包装器现在替换它们。
这些类更好地支持 FlutterActivity 不是应用程序中第一个也是唯一一个 Android Activity 的实际场景。
嵌入式 v2 为后台执行(例如,firebase 消息传递。查看changeLog)提供了更好的支持。
如果您正在开发插件,则应考虑从嵌入式 v2 开始。现有包已迁移或正在迁移。