Есть ли опыт работы с конфигурациями сборки (Flavors)?

«Есть ли опыт работы с конфигурациями сборки (Flavors)?» — вопрос из категории Сборка и компиляция, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я настраивал 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):

  1. Создаем новые Schemes (MyAppDev, MyAppProd).
  2. Создаем Configurations (Debug-Dev, Release-Dev и т.д.) на основе существующих.
  3. В 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

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