Миграция с версии 3.32.7 на 3.35.7
Этот раздел предназначен и актуален для миграции Flutter плагинов, использующих API Embedder, с версии 3.32.7 на 3.35.7.
Необходимо использовать инструкции ниже, чтобы подготовить проект для работы с новой версией.
- Ключевые изменения
- Миграция через команду
create - Ручная миграция плагина
- Пример использования нового API ClientWrapper
- Упрощение разработки плагинов, использующих Qt
- Изменения в работе с эмуляторами ОС Аврора
Ключевые изменения
В версии 3.35.7 была изменена работа приложения с API Embedder, чтобы улучшить обратную совместимость. Отдельный пакет aurora_client_wrapper теперь будет загружать Embedder в runtime, поэтому для взаимодействия с Embedder в него были перенесены все функции из API Embedder в виде C++ классов-оберток.
Список всех классов, предоставляющих доступ к API Embedder:
- ApplicationWrapper: предоставляет методы для взаимодействия и получения информации о приложении.
- ViewWrapper: предоставляет методы для взаимодействия и получения информации о состоянии текущего окна приложения.
- TextureRegistrar: предоставляет методы для взаимодействия с текстурами.
Миграция через команду create
Для частичной автоматизации миграции плагина можно воспользоваться командой flutter-aurora create. Для этого нужно удалить директорию aurora, после чего выполнить команду:
flutter-aurora create --template=*your_template* --platform=aurora --org={organization} .
Поле {organization} необходимо заменить на название организации, например ru.example.
После выполнения команды нативная логика будет удалена (например, aurora/lib/).
Можно воспользоваться системой контроля версий, чтобы вернуть файлы.
Если в aurora/CMakeLists.txt есть дополнительная логика, нужно восстановить блоки кода, оставив при этом изменения новой версии (см. Ручная миграция плагина).
Альтернативой является ручное редактирование файлов проекта по инструкции ниже.
Ручная миграция плагина
Так как Embedder теперь загружается через пакет aurora_client_wrapper, следует добавить этот пакет в зависимости проекта.
Для этого в файле "pubspec.yaml" нужно добавить зависимость:
dependencies:
...
aurora_client_wrapper: ^1.0.2
В файле "CMakeLists.txt" проекта необходимо убрать линковку с aurora_embedder и добавить AuroraClientWrapper следующим образом:
set(PLUGIN_NAME my_aurora_platform_plugin)
...
+# Add client_wrapper source
+include(AuroraClientWrapper)
+ADD_CLIENT_WRAPPER_SOURCE(${PLUGIN_NAME})
...
-target_link_libraries(${PLUGIN_NAME} PRIVATE aurora_embedder::aurora_embedder)
Для следующих заголовочных файлов необходимо обновить пути для включения:
flutter/basic_message_channel.h -> client_wrapper/basic_message_channel.hflutter/basic_plugin.h -> client_wrapper/basic_plugin.hflutter/binary_messenger.h -> client_wrapper/binary_messenger.hflutter/byte_streams.h -> client_wrapper/byte_streams.hflutter/encodable_value.h -> client_wrapper/encodable_value.hflutter/engine_method_result.h -> client_wrapper/engine_method_result.hflutter/error_or.h -> client_wrapper/error_or.hflutter/event_channel.h -> client_wrapper/event_channel.hflutter/event_sink.h -> client_wrapper/event_sink.hflutter/event_stream_handler_functions.h -> client_wrapper/event_stream_handler_functions.hflutter/event_stream_handler.h -> client_wrapper/event_stream_handler.hflutter/message_codec.h -> client_wrapper/message_codec.hflutter/method_call.h -> client_wrapper/method_call.hflutter/method_channel.h -> client_wrapper/method_channel.hflutter/method_codec.h -> client_wrapper/method_codec.hflutter/method_result_functions.h -> client_wrapper/method_result_functions.hflutter/method_result.h -> client_wrapper/method_result.hflutter/texture_registrar.h -> client_wrapper/texture_registrar.hflutter/plugin_registrar.h -> client_wrapper/plugin_registrar.hflutter/plugin_registry.h -> client_wrapper/plugin_registry.hflutter/standard_codec_serializer.h -> client_wrapper/standard_codec_serializer.hflutter/standard_message_codec.h -> client_wrapper/standard_message_codec.hflutter/standard_method_codec.h -> client_wrapper/standard_method_codec.h
Следует помнить, что все классы в пакете aurora_client_wrapper находятся в пространстве имён cw (до этого они все находились в пространстве имён flutter), поэтому необходимо исправить обращение к типам, например:
-flutter::EncodableValue
+cw::EncodableValue
Регистрация плагинов
Для регистрации нативной части плагинов следует обновить pubspec.yaml:
flutter:
plugin:
platforms:
aurora:
- pluginClass: MyPluginAurora
+ pluginEntryPointHeader: plugin.h
+ pluginEntryPoint: MyPluginRegisterWithRegistrar
Поле pluginEntryPointHeader определяет заголовочный файл, находящийся в папке aurora/include/my_plugin, в котором объявляется точка входа — функция плагина.
...
// my_plugin/aurora/include/my_plugin/plugin.h
...
#ifndef FLUTTER_PLUGIN_MY_PLUGIN_H
#define FLUTTER_PLUGIN_MY_PLUGIN_H
#ifdef PLUGIN_IMPL
#define PLUGIN_EXPORT __attribute__((visibility("default")))
#else
#define PLUGIN_EXPORT
#endif
#if defined(__cplusplus)
extern "C" {
#endif
PLUGIN_EXPORT void MyPluginRegisterWithRegistrar(FlutterAuroraPluginContext* context);
#if defined(__cplusplus)
} // extern "C"
#endif
#endif /* FLUTTER_PLUGIN_MY_PLUGIN_H */
Название функции для точки входа определяется в поле pluginEntryPoint, она будет экспортирована и вызвана для регистрации плагина. Её реализацию необходимо написать вручную следующим образом:
...
// my_plugin/aurora/plugin.cc
#include <my_plugin/plugin.h>
...
void MyPluginRegisterWithRegistrar(FlutterAuroraPluginContext* context) {
cw::PluginRegistrarManager::Register<MyPlugin>(context);
}
Пример использования нового API ClientWrapper
Для получения доступа к необходимому API нужно получить указатель на объект класса, реализующего взаимодействие с ним. Это делается через cw::PluginRegistrar, который можно получить при регистрации плагина в методе PluginNameRegisterWithRegistrar(cw::PluginRegistrar* registrar).
Классу FlutterKeyboardVisibilityAuroraPlugin в плагине
flutter_keyboard_visibility
нужен класс ViewWrapper для отслеживания открытия или закрытия клавиатуры:
#include <flutter_keyboard_visibility_aurora/flutter_keyboard_visibility_aurora_plugin.h>
...
class FlutterKeyboardVisibilityAuroraPlugin final : public cw::BasicPlugin<> {
public:
explicit FlutterKeyboardVisibilityAuroraPlugin(cw::PluginRegistrar* registrar);
...
private:
cw::ViewWrapper* view_;
}
Метод FlutterKeyboardVisibilityAuroraPluginRegisterWithRegistrar() передаёт cw::PluginRegistrar в конструктор класса:
void FlutterKeyboardVisibilityAuroraPluginRegisterWithRegistrar(FlutterAuroraPluginContext* context)
{
auto* registrar = cw::PluginRegistrarManager::GetRegistrar(context);
registrar->AddPlugin(std::unique_ptr<FlutterKeyboardVisibilityAuroraPlugin>(new FlutterKeyboardVisibilityAuroraPlugin(registrar)));
}
В конструкторе класс FlutterKeyboardVisibilityAuroraPlugin получает необходимый ViewWrapper из PluginRegistrar:
FlutterKeyboardVisibilityAuroraPlugin::FlutterKeyboardVisibilityAuroraPlugin(cw::PluginRegistrar *registrar)
: cw::BasicPlugin<>(Channels::kFlutterKeyboardVisibilityAurora, registrar->messenger()),
view_(registrar->view()) {}
Дальше он использует полученный класс-обёртку в своих целях:
FlutterKeyboardVisibilityAuroraPlugin::Result FlutterKeyboardVisibilityAuroraPlugin::OnSubscribe() {
// Listen to keyboard visibility changes.
if (keyboard_visibility_subscription_id_ == 0) {
keyboard_visibility_subscription_id_ = view_->KeyboardVisibilityChangedSubscribe(
[this](){
OnKeyboardVisibilityChanged();
}
);
}
return Result();
}
Упрощение разработки плагинов, использующих Qt
Поле useQt для разработчиков плагинов
В новой версии Flutter у разработчиков плагинов добавилась поддержка нового поля useQt в pubspec.yaml
flutter:
plugin:
platforms:
aurora:
...
+ useQt: true
Если разработчик плагина использует Qt API при разработке плагина, он должен добавить это поле в pubspec.yaml
своего плагина.
Для разработчиков приложений это поле означает уменьшение шаблонного кода по подключению Qt к своему приложению.
Если в приложении используется плагин, у которого прописано поле useQt: true, то весь необходимый код сгенерируется
автоматически невидимо для разработчика, без необходимости редактировать файл main.cpp. Т.е. main.cpp
будет иметь вид:
#include "generated_plugin_registrant.h"
int main(int argc, char *argv[]) {
aurora::FlutterApp app(argc, argv);
return app.exec();
}
Данный код не зависит от того, используется ли какой-либо из подключенных Qt-плагинов или нет.
Новый шаблон plugin_qt
Если начинается разработка нового плагина и точно известно, что потребуется использовать Qt,
можно воспользоваться новым шаблоном plugin_qt при создании проекта плагина:
flutter-aurora create --template=plugin_qt --platforms aurora --org=ru.aurora my_plugin
Результатом выполнения этой команды будет проект плагина, подготовленного к разработке с использованием Qt API.
Изменения в работе с эмуляторами ОС Аврора
В версии Аврора SDK 5.2.0 был представлен новый эмулятор ОС Аврора, основанный на QEMU. В версии Flutter 3.35.7 добавлена поддержка нового эмулятора наряду с эмуляторами VirtualBox.
Начиная с версии Flutter 3.35.7, чтобы воспользоваться любым из доступных эмуляторов, необходимо после установки Аврора SDK
задать параметр конфигурации aurora-sdk-dir с помощью команды:
flutter-aurora config --aurora-sdk-dir {AuroraSDK-install-dir}
Дальнейшее взаимодействие с эмуляторами через команды ниже не изменилось и позволяет отображать список доступных эмуляторов, а также выполнять их запуск:
flutter-aurora emulators
flutter-aurora emulators --launch {emulator}