В чем разница между Flutter Android Embedding V1 и V2

Я работаю над плагином для Flutter с фоновыми функциями.
Недавно я столкнулся с некоторыми проблемами, связанными с встраиванием Flutter в Android в android_alarm_manager.

Часть README говорит:

Для Flutter Android Embedding V1 фоновой службе должен быть предоставлен обратный вызов для регистрации плагинов с фоновым изолятом.

  • Что такое Внедрение Flutter для Android V1 или V2?
  • Каковы различия между этими двумя?

person Mahdi-Malv    schedule 30.01.2020    source источник
comment
Проект Flutter меньше, чем 1.12 с V1 и с 1.12 с новыми оболочками на стороне платформы Android V2. github.com/flutter/flutter/wiki/   -  person Blasanka    schedule 30.01.2020


Ответы (2)


  1. Flutter опубликовал новую версию своей вставки для Android. Это код Android, который отвечает за интеграцию Flutter в приложение Android. Он включает такие классы, как FlutterActivity, FlutterFragment, FlutterView и FlutterEngine. Встраивание Android v2 включает поддержку стандартных событий жизненного цикла Android и отделение выполнения Flutter от пользовательского интерфейса Android, которые отсутствовали в встраивании Android v1. Во время разработки встраивания Android v2 стало ясно, что существующий API для плагинов Flutter недостаточен для обработки новых возможностей встраивания Android v2. Требовался новый API-интерфейс Android-плагина.

  2. В старом встраивании Android v1 все плагины были инициализированы и настроены в самом начале приложения Android, и был только один опыт работы с Flutter. Во встраивании v2 мы не делаем предположений о том, когда инициализируется плагин, и плагин должен быть инициализирован один раз для каждого FlutterEngine. В результате все плагины Flutter для Android теперь должны поддерживать создание экземпляров вместо статической инициализации, а также поддерживать присоединение и отсоединение от FlutterEngine. Следующие примеры кода демонстрируют разницу между реализацией инициализации подключаемого модуля версии 1 в старой версии и процессом инициализации подключаемого модуля новой версии 2.

Инициализация старого плагина

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().
  }
}

Кроме того, ваш плагин не должен зависеть от ссылки Activity в onAttachedToFlutterEngine(). Тот факт, что ваш плагин подключен к интерфейсу Flutter, не означает, что интерфейс Flutter отображается в действии. Это одно из самых существенных различий между старым и новым API плагинов. В API плагинов старой версии v1 авторы плагинов могли рассчитывать на немедленную и постоянную доступность Activity. Это уже не так.

Для получения дополнительной информации см. плагин-разработка-4c3ee015cf5a

person Paresh Mangukiya    schedule 28.11.2020

Согласно документам:

Чтобы лучше поддерживать среду выполнения добавления Flutter в существующий проект, старые оболочки на стороне платформы Android, в которых размещена среда выполнения Flutter по адресу io.flutter.app.FlutterActivity, и связанные с ними классы теперь устарели. Новые оболочки в io.flutter.embedding.android.FlutterActivity и связанные с ними классы теперь заменяют их.

Эти классы лучше поддерживают сценарии реального мира, когда FlutterActivity не является первой и единственной активностью Android в приложении.

Встроенная версия 2 обеспечивает лучшую поддержку таких вещей, как фоновое выполнение (например, обмен сообщениями Firebase. Ознакомьтесь с changeLog) .

Если вы разрабатываете плагин, вам следует подумать о том, чтобы начать со встроенной версии 2. Существующие пакеты уже перенесены или переносятся.

person Mahdi-Malv    schedule 10.02.2020