환경을 나누기 위한 env.dart
를 만든 다음 import 'package:meta/meta.dart';
를 임포트하고,
enum으로 BuildFlavor를 나눠준다(나누고 싶은 빌드 모드).
그리고 BuildEnvironment
클래스를 사용한다.
import 'package:meta/meta.dart';
enum BuildFlavor { production, development, qa }
BuildEnvironment get env => _env;
BuildEnvironment _env;
class BuildEnvironment {
/// The backend server.final String baseUrl;
final BuildFlavor flavor;
BuildEnvironment._init({this.flavor, this.baseUrl});
/// Sets up the top-level [env] getter on the first call only.static void init({@required flavor, @required baseUrl}) =>
_env ??= BuildEnvironment._init(flavor: flavor, baseUrl: baseUrl);
}
main_dev.dart
import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';
void main() {
BuildEnvironment.init(
flavor: BuildFlavor.development, //이부분에 enum으로 선언한 flavor를 지정
baseUrl: 'http://development_server.com'); //이부분에 url사용
assert(env != null);
runApp(App());
}
main_prod.dart
import 'package:flutter/material.dart';
import 'env.dart';
import 'app.dart';
void main() {
BuildEnvironment.init(
flavor: BuildFlavor.production, //이부분에 enum으로 선언한 flavor를 지정
baseUrl: 'http://production_server.com'); //이부분에 url사용
assert(env != null);
runApp(App());
}
main.dart
는 삭제해도 된다. 그런데 우리는 main.dart에 너무 많은것을 집어넣어두었다면? runApp()
아래 부분에 다른 클래스나 함수를 만들어두었다면 파일을 나누어서 main_$flavor.dart
들이 공용으로 사용하게 하고, runZonedGuarded
나 await Firebase.initializeApp();
같이 메인에 엮는 기능은 각각의 main에 모두 넣어주자.{
"version": "0.2.0",
"configurations": [
{
"name": "development",
"program": "lib/main_dev.dart",
"request": "launch",
"type": "dart"
},
{
"name": "production",
"program": "lib/f.dart",
"request": "launch",
"type": "dart"
}
{
"name": "qa",
"program": "lib/main_qa.dart",
"request": "launch",
"type": "dart"
}
]
}
이제 플러터를 run하거나 build할 때는 target
"-t" 옵션을 사용해야 한다.
flutter run -t lib/main_dev.dart flutter build -t lib/main_dev.dart