Вы когда-нибудь задумывались, как некоторые мобильные приложения имеют варианты с правами администратора и без администратора? Приложение администратора имеет другой пользовательский интерфейс, чем неадминистративный. Или вы видели некоторые приложения в Play Store или App Store с премиальными и бесплатными версиями? Итак, как на самом деле это делают разработчики? Как они создают несколько вариантов одного и того же проекта? Они управляют несколькими кодовыми базами? Есть ли одна команда, ответственная за разработку одного варианта, и другая команда, разрабатывающая другой вариант с двумя разными кодовыми базами? И четкий и короткий ответ на это НЕТ.

Для компаний было бы дорого нанять две разные команды для создания двух разных вариантов приложения. Итак, как это возможно? И неудивительно, что ответом на этот вопрос является использование Product Flavor.

Как следует из названия, вариант продукта (или вариант продукта) — это способ создать несколько вариантов вашего приложения из одной кодовой базы. Мы также можем развернуть эти разные приложения независимо друг от друга в соответствующих магазинах.

Выполнение

Теперь мы начнем создавать наши ароматы. У нас будет административная версия и неадминистративная версия. Я буду делать приложения очень простыми и отображать в них текст This is the admin UI и This is the non-admin UI. В реальном приложении вы можете следовать тем же методам, которые я вам покажу, и иметь пользовательские интерфейсы в соответствии с вашими пожеланиями.

Во-первых, мы добавим конфигурацию в файл build.gradle уровня приложения внутри блока android.

Поскольку у нас будет создано два разных приложения, нам нужны два разных имени для каждого из наших приложений. Для этого нам нужно перейти к файлу /android/app/src/main/AndroidManifest.xml и отредактировать файл android:label.

Теперь нам нужно создать два файла main.dart в нашем каталоге lib. Мы назовем их main_admin.dart и main_non_admin.dart.

Мы создадим наш виджет MyApp() через мгновение, но давайте сначала позаботимся о некоторых других вещах.

Для пользователей кода VS

Если вы являетесь пользователем VS Code, вам необходимо выполнить некоторые шаги, которые я вам сейчас покажу.

Сначала создайте папку .vscode в корневом каталоге проекта. Затем создайте внутри него файл launch.json и добавьте следующий фрагмент.

Теперь, если вы перейдете к опции Run and Debug в своем VS Code или удержите Ctrl+Shift+D, вы увидите раскрывающееся меню. Нажав на нее, вы должны увидеть возможность отладки двух разных вариантов приложения.

Для пользователей Android Studio

Если вы используете Android Studio, вам нужно выполнить некоторые шаги, которые я вам сейчас покажу.

Перейдите к опции Edit Configurations на вкладке Run. Должно открыться новое окно. Затем вам нужно добавить конфигурации для каждого вкуса.

В параметре Dart entrypoint добавьте путь к файлу main_admin.dart, используя параметр обзора с правой стороны. В опции Additional run args добавьте

--flavor admin --dart-define=appType=admin

Теперь добавьте еще одну конфигурацию для приложения без прав администратора.

Выполните те же шаги, что указаны выше, и в опции Additional run args добавьте

--flavor non_admin --dart-define=appType=nonAdmin

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

Опция dart-define, которую мы добавили в нашу команду, важна для определения типа приложения во время выполнения. Мы увидим, как мы можем использовать его для определения типов приложений.

Создайте новый файл app_config.dart внутри каталога lib.

Значение String.fromEnvironment() исходит из параметра dart-define, который мы установили ранее для каждого варианта приложения. Теперь, используя логическое значение isAdminApp, мы можем легко проверить, является ли запущенное в данный момент приложение приложением администратора или приложением, не являющимся администратором, и соответствующим образом отобразить пользовательские интерфейсы.

Теперь создайте новый файл my_app.dart внутри каталога lib, который будет содержать код для нашего класса MyApp(). Я стараюсь очень просто отображать разные пользовательские интерфейсы для каждого варианта приложения. Однако вы можете воспользоваться этой идеей и создать настолько сложный пользовательский интерфейс, какой захотите, для каждого варианта приложения.

Как видите, у нас есть класс _AdminBody() и класс _NonAdminBody(), которые помогут нам отображать пользовательские интерфейсы в зависимости от приложения, которое мы запускаем.

При запуске обоих вариантов приложения у нас будет два разных приложения, созданных с одной кодовой базой.

Заключение

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

Если вы хотите увидеть проекты Flutter с правильной архитектурой, подписывайтесь на меня на GitHub. Я также активен в Твиттере @b_plab.

Исходный код

Мои социальные сети:

До следующего раза, удачного кодирования!!! 👨‍💻

— Биплаб Датта