14

我正在为 Flutter 开发一个带有背景内容的插件。
最近,我遇到了一些关于Flutter android 嵌入android_alarm_manager插件中的问题。

一部分README说:

对于 Flutter Android Embedding V1,必须为后台服务提供一个回调来向后台隔离注册插件。

  • Flutter android 嵌入V1 或 V2到底是什么?
  • 这两者有什么区别?
4

2 回答 2

8
  1. Flutter 发布了其 Android 嵌入的新版本。这是负责将 Flutter 集成到 Android 应用程序中的 Android 代码。它包括FlutterActivityFlutterFragmentFlutterView和等类FlutterEngine。v2 Android 嵌入包括对标准 Android 生命周期事件的支持以及 Flutter 执行与 Android UI 的分离,这些在 v1 Android 嵌入中是缺失的。在 v2 Android 嵌入的开发过程中,很明显,现有的 Flutter 插件 API 不足以处理 v2 Android 嵌入的新功能。需要一个新的 Android 插件 API。

  2. 在旧的 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

于 2020-11-28T04:15:37.477 回答
6

根据文档

为了更好地支持将 Flutter 添加到现有项目的执行环境,在 io.flutter.app.FlutterActivity 托管 Flutter 运行时的旧 Android 平台端包装器及其相关类现已弃用。io.flutter.embedding.android.FlutterActivity 和相关类的新包装器现在替换它们。

这些类更好地支持 FlutterActivity 不是应用程序中第一个也是唯一一个 Android Activity 的真实场景。

嵌入式 v2 为后台执行(例如 firebase 消息传递。检查changeLog)提供了更好的支持。

如果您正在开发插件,则应考虑从嵌入式 v2 开始。现有包已迁移或正在迁移。

于 2020-02-10T08:24:37.930 回答