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