🐙

Flutter実行時にコマンドラインオプションで変数を渡してアプリの挙動を切り替える

2020/09/17に公開

Flutterアプリを開発している際に、使っているWeb APIの環境を切り替えたり、firebaseのlocal emulatorを使ったり、スクリーンショットを取るためにデバッグバナーを一時的に消したりと、アプリの挙動を切り替えたいことが多々あります。

こうした実行時の挙動の変更は、環境変数を使って実現できます。

以下では、Dartの --dart-defineコマンドラインオプションを使って、Flutterアプリの挙動を実行時に切り替える方法を紹介します。

簡単な使い方

flutter run 実行時に--dart-defineで環境変数を渡します。

$ flutter run --dart-define=BOOL_VALUE=true --dart-define=STRING_VALUE="hello commandline options"

dartのプログラムからはfromEnvironmentメソッドで値を読み込みます。

bool.fromEnvironment('BOOL_VALUE');
String.fromEnvironment('STRING_VALUE');

デバッグバナーのON/OFFを切り替える例

一例として、デバッグバナーのON/OFFを切り替える場合を考えます。

環境変数の参照は以下のように定義しておくと良いでしょう。

class EnvironmentVariables {
 EnvironmentVariables._();
 
 static const disableDebugBanner =
     bool.fromEnvironment('DISABLE_DEBUG_BANNER');
}

MaterialAppのdebugShowCheckedModeBannerに上記の値を渡します。

MaterialApp(
    ...
     debugShowCheckedModeBanner: !EnvironmentVariables.disableDebugBanner,
;

以下の様に実行すると、デバッグバナーが非表示になります。

$ flutter run --dart-define=DISABLE_DEBUG_BANNER=true

VS Codeで切り替えて実行できるようにする

次に、上記のようなコマンドラインオプションを渡す、渡さないをVS Codeから実行する際に切り替えられるようにします。

launch.json のconfigurationsで、"args"を指定したコンフィギュレーションを"Flutter with commandline options"という名前で追加します。

    "configurations": [
       {
            "name": "Flutter",
            ...
       },    
       {
           "name": "Flutter with commandline options",
           "program": "lib/main.dart",
           "request": "launch",
           "type": "dart",
            "args": [
               "--dart-define=BOOL_VALUE=true",
               "--dart-define=STRING_VALUE=hello commandline options"
           ]
       }
    ]

以上で、VS CodeのRun画面でドロップダウンリストからデフォルトの、コマンドライン引数なしでの実行か、コマンドラインオプションを渡しての実行かを切り替えられるようになります。

まとめ

以前調べたときはコマンドラインオプションを渡す方法が見つからなかったのですが、Flutter 1.17からできるようになっていました。

これまではややトリッキーなやり方で、どうしてもdartのコード側で何かしらの処理をしないといけなかったのですが、これでスッキリ切り替えられるようになりました。

Happy coding!

Discussion