Mah*_*alv 12 android android-embedded-api dart flutter flutter-android
我正在为 Flutter 开发一个带有背景内容的插件。
最近,我在android_alarm_manager插件中遇到了有关Flutter android 嵌入的问题。
一部分README
说:
对于 Flutter Android Embedding V1,必须为后台服务提供回调以将插件注册到后台隔离。
根据文档:
为了更好地支持将 Flutter 添加到现有项目的执行环境,在 io.flutter.app.FlutterActivity 及其相关类中托管 Flutter 运行时的旧 Android 平台端包装器现在已弃用。io.flutter.embedding.android.FlutterActivity 和相关类的新包装器现在取代了它们。
这些类可以更好地支持 FlutterActivity 不是应用程序中第一个也是唯一一个 Android Activity 的真实场景。
嵌入式 v2 为诸如后台执行之类的事情提供了更好的支持(例如,firebase 消息传递。检查changeLog)。
如果您正在开发插件,您应该考虑从嵌入式 v2 开始。现有包已经迁移或正在迁移。
Flutter 发布了其 Android 嵌入的新版本。这是负责在 Android 应用程序中集成 Flutter 的 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.
}
}
Run Code Online (Sandbox Code Playgroud)
新插件初始化
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().
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您的插件不得依赖于 onAttachedToFlutterEngine() 中的 Activity 引用。仅仅因为您的插件附加到 Flutter 体验并不意味着 Flutter 体验正在显示在 Activity 中。这是新旧插件 API 之间最显着的区别之一。在旧的 v1 插件 API 中,插件作者可以依赖于立即和永久可用的 Activity。这不再是事实。
有关更多信息,请参阅https://medium.com/flutter/modern-flutter-plugin-development-4c3ee015cf5a
归档时间: |
|
查看次数: |
7547 次 |
最近记录: |