1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Flutter-14.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Этот пост поможет вам глубже понять принципы упаковки и установки плагинов в Flutter, а также быстро интегрировать Flutter в существующий проект Android с поддержкой гибридной разработки.

Ссылка на статью:

Полный实战 Flutter серия статей

Flutter дополнительные материалы серии статей

Введение

С появлением различных кросс-платформенных фреймворков, часто мы выбираем модель гибридной разработки как основу. Это связано с тем, что компании обычно не полагаются полностью на один фреймворк для бизнеса. Кроме того, если это не новый проект, то из соображений стоимости и риска рефакторинга существующего бизнеса, они предпочитают использовать гибридную разработку.

Однако гибридная разработка требует более высокого уровня знаний относительно процессов сборки, упаковки и запуска. При этом возникают больше проблем. Ранее я тоже писал аналогичную статью для React Native: «От Android до React Native разработка (четвертая часть: анализ процесса сборки и публикация в Maven)».

Имеются общие подходы, которые можно применить, поэтому использование модели гибридной разработки может помочь избежать некоторых проблем. Только при понимании общих принципов сборки проекта Flutter вы сможете комфортно работать с ним.> К слову, цель кросс-платформенной разработки заключается в унификации логики для нескольких платформ, чтобы избежать повторного создания одного и того же кода. Поэтому компании начинают с простых задач, чтобы протестировать возможности фреймворка.

Официальные разработчики планируют внедрить метод Flutter build aar для использования.

Упаковка

Обычно для гибридной разработки есть два варианта:

    1. Интеграция всего фреймворка Flutter и скриптов сборки в основной проект.
    1. Добавление целевой библиотеки AAR в основной проект.

Каждый вариант имеет свои преимущества и недостатки:

  • Первый способ позволяет легко исправлять проблемы во время выполнения, но он увеличивает "загрязнение" основного проекта и требует большего количества изменений.

  • Второй способ требует отдельной отладки и обновления файла AAR перед его интеграцией в проект, однако этот подход чище, поскольку код Flutter может быть отдельно тестирован, и требуется меньше изменений.Обычно я рекомендую второй способ для обычных проектов. Он позволяет создать новый проект Flutter, который может быть собран как APK для отладки и как AAR для предоставления внешним сторонам. Должны были быть знакомы с платформой native, мы можем внести небольшие изменения в скрипт проекта gradle, чтобы быстро поддерживать эту возможность, как показано на следующем изображении. Изображение представляет собой отсутствующий фрагмент кода скрипта, полная версия которого доступна по адресу flutter_app_lib.image1

Мы используем метку isLib для простой реализации проверки сборки проекта. Когда проект используется как библиотека (lib), следует установить значение isLib равным true, после чего выполните команду ./gradlew assembleRelease. Оставшаяся часть процесса сборки будет выполняться самим Flutter, а полученный файл .aar можно использовать в проектах на native уровне.

Если вам требуется token, данные пользователя и т.п., рекомендуется предоставить определённые native интерфейсы, такие как init(String token, String userInfo) и т.п., затем используйте MethodChannel для передачи информации в Flutter.

Для основного проекта на native уровне достаточно добавить файл .aar, завершить его инициализацию и открыть страницу, не беспокоясь о внутренней реализации, что аналогично использованию обычной зависимости.

Возможно, вам также потребуется удалить запуск MainActivity из файла AndroidManifest, а затем добавить свой Activity, который наследует FlutterActivity.

3. Плагины

В большинстве случаев, до этого этапа можно считать завершённой интеграцию Flutter, но зачастую всё оказывается сложнее. Некоторые плагины Flutter предоставляют свои возможности через native код, например, flutter_webview, android_intent, device_info и т.п. Как эти плагины используются?> Здесь стоит отметить, что те, кто работал с React Native, должны знать, что плагины React Native со встроенным native кодом требуют команды react-native link для завершения установки после установки через npm. Эта команда запускает скрипт, который модифицирует native код, добавляет ссылки на плагины в скрипты gradle, а также модифицирует Java-код для включения шаблонов плагинов, что приводит к некоторому "загрязнению" проекта плагинами.Плагины React Native с native кодом обычно добавляются в виде локальных модулей. А что насчёт Flutter?

На самом деле, принцип тот же: после установки плагинов Flutter с native кодом они добавляются в виде локального модульного проекта. Однако этот процесс происходит более изящным образом, делая его почти незаметным для разработчика. Как показано ниже, возможно, вы заметили, что после установки плагинов все плагины с нативным кодом хранятся в виде пар "ключ=значение" путей и имён плагинов в файле .flutter-plugins.

image2

В файле settings.gradle проекта Android, как показано ниже, этот файл читается для включения каждого проекта из файла .flutter-plugins в основной проект.

image3

Затем используется скрипт apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle", который обычно находится в директории flutterSDK/packages/flutter_tools/gradle/, как показано ниже. Основная часть этого скрипта также заключается в чтении проектов из файла .flutter-plugins и последующего добавления их в качестве зависимостей в основной проект с помощью implementation.

image4

С этого момента все плагины Flutter с native кодом были добавлены в основной проект в виде локальных модулей проекта. В конце концов, скрипт автоматически генерирует файл GeneratedPluginRegistrant.java, который регистрирует использование нативного кода, и этот процесс происходит без вашего участия.Разговор был таким долгим, чтобы объяснить, почему если плагины добавляются в виде локальных модулей проекта, то просто сборка aar может вызвать проблемы:

По умолчанию при сборке Gradle Android собирает только зависимости проекта и удалённые зависимости, а не исходный код и ресурсы.

Поэтому здесь требуется помощь fat-aar, подробное описание которого можно найти здесь. Можно представить его как плагин, поддерживающий объединение всех зависимых кодов и ресурсов в один aar.

Как показано ниже, мы добавляем apply plugin: 'com.kezong.fat-aar' в наш существующий компонентный скрипт, чтобы затем использовать .flutter-plugins файл для embed зависимости, как это делает Flutter.

image5 > Полный вариант доступен по ссылке flutter_app_lib.

Четвёртый раздел. Стек

И последняя тема, которую стоит затронуть — это управление стеком.

Если говорить о том, что является наиболее сложной задачей в гибридной разработке, то это точно управление стеком между различными платформами. Обычно мы стараемся избегать взаимодействия смешанных стеков, но когда это невозможно, XianYu предлагает свой подход: fluttet_boost.

Мы знаем, что весь проект Flutter отрисовывается на одном Surface, а fluttet_boost объединяет стек на нативном уровне через единственный экземпляр flutter engine.Каждый FlutterFragment и FlutterActivity представляет собой контейнер для Surface. При смене страниц происходит переход от одного Surface к другому, а для невидимых страниц используется кэширование скриншотов Surface.

Таким образом, вся маршрутизация Flutter отображается в нативном стеке, который управляется нативными страницами. Каждое добавление страницы (push) в Flutter приводит к запуску нового Activity.

На момент тестирования flutter_boost (16 мая 2019 года) он поддерживает версии до 1.2. Процесс работы flutter_boost достаточно сложен, также его поддержка диалоговых окон ограничена, и при глубоких переходах бизнес-логики могут возникнуть проблемы с черным экраном.

Так заканчивается четырнадцатая статья! (///▽///)

Рекомендации по материалам:

Рекомендации по полному открытому проекту:

Увидимся ли снова?

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master