Могу ли я создавать пакеты для Flutter?

Вопрос или проблема

Вопрос

Возможно ли построить только пакет Flutter в режиме релиза, а затем ссылаться на (ссылку) его из артефакта сборки релизного приложения Flutter (libapp.so)?

Целевая среда

  • Linux
  • flutter 3.10.6 или новее

Предыстория

Я разрабатываю приложение Flutter (=appX). Это приложение состоит из нескольких локальных пакетов Flutter (=packageA, packageA’).
packageA и packageA’ предоставляют один и тот же интерфейс, но имеют разное поведение. appX использует только один из packageA и packageA’.
В настоящее время переменные dart-define определяют, использовать ли packageA или packageA’ при компиляции appX.

Тем не менее, я хотел бы переключаться между packageA и packageA’ с использованием следующей процедуры. (Причина, по которой я хочу это сделать, довольно сложна, поэтому я не буду углубляться в нее здесь.)

  • Скомпилировать packageA и packageA’ в режиме релиза и создать файлы с одинаковым именем (packageA-selected.so)
  • Во время установки решить, использовать ли packageA.so или packageA’.so, и установить packageA-selected.so, который будет использоваться.
  • libapp.so использует packageA-selected.so при запуске.

Я хотел бы спросить, возможна ли такая процедура.

Спасибо!

Ответ или решение

Да, вы можете создавать Flutter-пакеты и использовать их в приложении Flutter. Ваша идея о разделении пакетов (packageA и packageA’) с разными реализациями и использовании одного из них в зависимости от условий установки интересна и вполне выполнимая задача.

Ниже приведены шаги для достижения вашей цели:

Шаг 1: Создание пакетов в режиме релиза

  1. Создайте ваши пакеты (packageA и packageA') как обычные Flutter-пакеты. Убедитесь, что они имеют одинаковый интерфейс, чтобы ваше приложение (appX) могло ссылаться на них без изменений в коде.

  2. Соберите пакеты в режиме релиза. Вы можете сделать это, используя команду:

    flutter build linux --release --target=path_to_your_packageA
    flutter build linux --release --target=path_to_your_packageA'

    Это создаст соответствующие файлы packageA.so и packageA'.so в выходных директориях.

Шаг 2: Создание файла с требуемым именем

  1. Переименуйте скомпилированные файлы так, чтобы они имели одинаковое имя, как вы и планировали. Например, переименуйте их в packageA-selected.so. Это можно сделать с помощью командной строки:
    mv build/linux/x64/release/your_library/packageA.so build/linux/x64/release/your_library/packageA-selected.so
    mv build/linux/x64/release/your_library/packageA'.so build/linux/x64/release/your_library/packageA-selected.so

Шаг 3: Установка и использование

  1. При установке вашего приложения (appX) решите, какой пакет использовать. В зависимости от ваших условий, вы должны выбрать нужный packageA-selected.so для установки.

  2. Обновите libapp.so вашего приложения так, чтобы он ссылался на packageA-selected.so. Вы можете сделать это с помощью динамической загрузки библиотек. В вашем приложении, при инициализации, вы можете загрузить нужную библиотеку с помощью:

    import 'dart:ffi' as ffi;
    
    ffi.DynamicLibrary.open('path/to/packageA-selected.so');

Заключение

Этот процесс позволяет вам выбирать между разными реализациями пакетов без необходимости пересборки всего приложения, а только загружая нужную библиотеку в момент выполнения. Убедитесь, что ваши библиотеки правильно экспортируют функции и классы, которые использует ваше приложение.

Важные примечания

  • Тестирование: Обязательно протестируйте приложение в различных сценариях, чтобы убедиться, что правильные библиотеки загружаются и функционируют как ожидается.
  • Документация: Поскольку это немного нестандартный подход, убедитесь, что в вашем проекте есть хорошая документация для будущих разработчиков, которые могут работать с вашим кодом.

Если у вас возникнут дополнительные вопросы или потребуется помощь, не стесняйтесь обращаться! Удачи с вашим проектом!

Оцените материал
Добавить комментарий

Капча загружается...