通常アプリを開発する際、例えば呼び出されるAPIには、テスト環境用と本番環境用のエンドポイントがあります。
この記事では、テスト環境と本番環境で異なる値を参照するためのシンプルなアプローチを紹介します。
目次
最終的なゴール
下記の通り、環境毎に異なる設定値が定義されたコレクションを準備し、アプリケーションからそのコレクションを参照させます。
const environment = {
'isProd': true,
'apiBaseUri': 'https://production.exampel.com',
};
実装
bool.fromEnvironment('dart.vm.product')
にて現在の実行環境がdevelopment
なのか、release
なのか判定する事が出来ます。
flutter build <target>
コマンドにてリリース用ビルドを生成した際や、flutter run --release
コマンドにてアプリケーションを実行した際にrelease
モードであると判定されます。
よって下記のように実装することが可能です。
const bool isProduction = bool.fromEnvironment('dart.vm.product');
const VariablesDev = {
'isProd': false,
'apiBaseUri': 'http://development.exampel.com',
};
const VariablesProd = {
'isProd': true,
'apiBaseUri': 'https://production.exampel.com',
};
final environment = isProduction ? VariablesProd : VariablesDev;
例えばHTTP通信の土台を担うRepository
クラスから参照する場合は下記の通りです。
class Repository
{
final String _apiBaseUri = environment['apiBaseUri'];
Future<http.Response> post(String path, Map<String, dynamic> data) async
{
final String body = json.encode(data);
final http.Response response = await http.post('$_apiBaseUri$path', body: body);
return response;
}
}
環境毎にenvironment
の内容が動的に変化するため、コードベースを非常にシンプルに保つことが可能になります。