Ответ
Да, я настраивал flavors для создания разных сборок приложения (dev, staging, prod) с уникальными параметрами.
Цель: Разделить конфигурации для разных сред: разные API-эндпоинты, ключи Firebase, идентификаторы приложения (bundle ID), иконки и названия.
Настройка для Android (android/app/build.gradle):
android {
...
flavorDimensions "environment"
productFlavors {
dev {
dimension "environment"
// Добавляем суффикс к ID для установки рядом с prod версией
applicationIdSuffix ".dev"
// Задаем другое имя для иконки
resValue "string", "app_name", "MyApp Dev"
// Можно менять переменные для манифеста
manifestPlaceholders = [appIcon: "@mipmap/ic_launcher_dev"]
}
prod {
dimension "environment"
resValue "string", "app_name", "MyApp"
}
}
}
Настройка для iOS (через Xcode):
- Создаем новые Schemes (MyAppDev, MyAppProd).
- Создаем Configurations (Debug-Dev, Release-Dev и т.д.) на основе существующих.
- В
Info.plistдля разных конфигураций задаем разные значения для ключей (например,CFBundleName).
Использование в Dart-коде:
Создаем отдельные entry-point файлы (например, main_dev.dart, main_prod.dart), которые инициализируют приложение с нужными параметрами.
// lib/main_dev.dart
void main() {
// Устанавливаем конфиг для dev среды
final config = AppConfig(
apiBaseUrl: 'https://dev.api.example.com',
appName: 'MyApp Dev',
flavor: 'dev',
);
runApp(MyApp(config));
}
// lib/main_prod.dart
void main() {
final config = AppConfig(
apiBaseUrl: 'https://api.example.com',
appName: 'MyApp',
flavor: 'prod',
);
runApp(MyApp(config));
}
Запуск сборки:
# Запуск dev-версии
flutter run --flavor dev -t lib/main_dev.dart
# Сборка APK для dev
flutter build apk --flavor dev -t lib/main_dev.dart
# Сборка App Bundle для prod
flutter build appbundle --flavor prod -t lib/main_prod.dart
Такой подход полностью исключает ручное изменение конфигов при переключении между средами разработки, тестирования и продакшена.