Управление переменными окружения в Flutter Web
FlutterPulseЭта статья переведена специально для канала FlutterPulse. В этом канале вы найдёте много интересных вещей, связанных с Flutter. Не забывайте подписываться! 🚀

Введение
Введение
Управление переменными окружения в Flutter Web требует другого подхода по сравнению с мобильными приложениями. Поскольку Flutter Web не может читать .env файлы с сервера, нам нужна гибридная стратегия:
✅ Используйте flutter_dotenv для локальной разработки (загружает .env файлы).
✅ Используйте dart-define для развертывания (поскольку .env нельзя использовать на серверах продакшена).
✅ Настройте VS Code для удобного переключения окружений.
Это руководство проведет вас через лучший способ управления переменными окружения в Flutter Web. 🚀
1. Установка зависимостей
Выполните следующую команду для добавления поддержки dotenv:
flutter pub add flutter_dotenv
2. Создание файлов окружения
В корне проекта Flutter создайте три .env файла:
.env.dev
API_URL=https://api.dev.local
.env.uat
API_URL=https://api.uat.local
.env.prod
API_URL=https://api.prod.local
Игнорирование .env файлов в Git
Измените .gitignore чтобы предотвратить коммит файлов окружения:
.env*
Также зарегистрируйте .env файлы в вашем pubspec.yaml в разделе assets:
flutter:
assets:
- .env.dev
- .env.uat
- .env.prod
3. Создание отдельного файла env_config.dart
Вместо управления переменными окружения в main.dart, создайте отдельный файл для поддержания чистоты кода.
lib/core/env_config.dart
import 'package:flutter_dotenv/flutter_dotenv.dart';
class EnvConfig {
/// Проверяет, запущено ли приложение на Web
static final bool isWeb = const bool.fromEnvironment('IS_WEB', defaultValue: false);
/// Читает тип окружения (dev, uat, prod) из `dart-define`. По умолчанию 'dev'.
static final String env = const String.fromEnvironment('ENV', defaultValue: 'dev');
/// Загружает правильный файл окружения для локальной разработки.
static Future<void> loadEnv() async {
if (!isWeb) {
String envFile = '.env.$env';
try {
await dotenv.load(fileName: envFile);
} catch (e) {
throw Exception('Не удалось загрузить файл окружения: $envFile. Убедитесь, что он существует.');
}
}
}
/// Получает URL API из `dart-define` или файла `.env`.
static String get apiUrl {
return const String.fromEnvironment('API_URL', defaultValue: '')
.isNotEmpty
? const String.fromEnvironment('API_URL')
: dotenv.env['API_URL'] ?? 'https://api.default.com';
}
}
Почему такой подход?
✅ Обеспечивает динамическую загрузку правильного файла .env
✅ Поддерживает как локальную разработку (dotenv) и развертывание (dart-define)
✅ Предотвращает ошибки отсутствия файла окружения
4. Обновление main.dart
Измените main.dart, чтобы правильно загружать переменные окружения.
main.dart
import 'package:flutter/material.dart';
import 'core/env_config.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await EnvConfig.loadEnv();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Web Env',
home: Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('API_URL: ${EnvConfig.apiUrl}'),
],
),
),
),
);
}
}
5. Запуск и развертывание приложения
Для локальной разработки (Используя .env)
Запустите приложение с соответствующим файлом окружения:
flutter run --dart-define=ENV=dev
Это загружает .env.dev. Аналогично для UAT и Prod:
flutter run --dart-define=ENV=uat
flutter run --dart-define=ENV=prod
Для веб-развертывания (Используя dart-define)
Поскольку файлы .env нельзя читать в продакшене, мы передаем значения с помощью dart-define.
Для Production:
flutter build web --dart-define=IS_WEB=true --dart-define=ENV=prod --dart-define=API_URL=https://api.prod.com
Для UAT:
flutter build web --dart-define=IS_WEB=true --dart-define=ENV=uat --dart-define=API_URL=https://api.uat.com
Для Dev:
flutter build web --dart-define=IS_WEB=true --dart-define=ENV=dev --dart-define=API_URL=https://api.dev.com
6. Настройка VS Code для быстрого переключения сред
Чтобы упростить переключение сред, настройте файл .vscode/launch.json.
.vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Flutter Web (Dev)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": ["--dart-define=ENV=dev"],
"envFile": "${workspaceFolder}/.env.dev"
},
{
"name": "Flutter Web (UAT)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": ["--dart-define=ENV=uat"],
"envFile": "${workspaceFolder}/.env.uat"
},
{
"name": "Flutter Web (Prod)",
"type": "dart",
"request": "launch",
"program": "lib/main.dart",
"args": ["--dart-define=ENV=prod"],
"envFile": "${workspaceFolder}/.env.prod"
}
]
}Заключение
✅ Локальная разработка → Использует файлы .env
✅ Развёртывание в продакшн → Использует dart-define
✅ Настройки VS Code → Легко переключаться между средами
Такой подход обеспечивает чистое, масштабируемое и готовое к продакшн решение для управления переменными окружения в Flutter Web. 🚀
💬 Если кто-то знает способ управления одной средой для локальной разработки и развёртывания, сообщите в комментариях!