Flutter Android Embedding V1 和 V2 有啥区别

Posted

技术标签:

【中文标题】Flutter Android Embedding V1 和 V2 有啥区别【英文标题】: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 到底是什么? 这两者有什么区别?

【问题讨论】:

Flutter 项目 leser 1.12 具有 V1 和 1.12 具有新的 V2 Android 平台端包装器。 github.com/flutter/flutter/wiki/… 【参考方案1】:

    Flutter 发布了其 Android 嵌入的新版本。这是负责将 Flutter 集成到 Android 应用程序中的 Android 代码。它包括 FlutterActivityFlutterFragmentFlutterViewFlutterEngine 等类。 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 开始。现有包已迁移或正在迁移。

【讨论】:

以上是关于Flutter Android Embedding V1 和 V2 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

Flutter-desktop-embedding 如何构建 exe 文件

Flutter Desktop - flutter-desktop-embedding 如何将文件保存到硬盘

关于 flutter_boost splash加载动画

应用程序关闭时推送通知不起作用 - Flutter

[Flutter] Windows桌面程序开发

Flutter插件开发之FlutterChannel :Flutter调用Android 与 Android调用Flutter