## はじめに
--dart-define および --dart-define-from-file はビルド時に定数を渡せる機能です。
flutter run --dart-define=NAME=k9i
のようにすると、Dartコードで
const String.fromEnvironment('NAME');
として定数の値を取り出せます。
以下の記事のようにFlutterの環境分けに使っている方が多いと思います。
restartするまで定数の値が反映されない現象に遭遇
今回既存アプリに新しい--dart-defineを追加したところ、アプリをrestartするまで定数の値が反映されない現象に遭遇しました。
具体的には最初の例で言うと
起動直後は
print('name: ${const String.fromEnvironment('NAME')}');
で
name:
と表示されるのです。
その後restartすると
name: K9i
となり、ますます謎でした。
原因
今回の問題はiOSでのみ発生しました。
具体的な原因はDebug.xcconfig、Release.xcconfigにDART_DEFINESが直書きされていたことでした。
何も設定してない場合Debug.xcconfigはこんな感じで、Generated.xcconfigをincludeしています。
#include "Generated.xcconfig"
今回
#include "Generated.xcconfig"
DART_DEFINES=hoge
のようになっていました。
(hogeの部分はbase64エンコードされた定数)
あるべき姿
Generated.xcconfigはFlutterのビルドプロセスで自動生成されるファイルです、Flutterフレームワークへのパスやアプリのバージョン情報が設定されます。(詳細はお手元のFlutterプロジェクトをご覧ください。)
--dart-defineを使っている場合は、その情報もGenerated.xcconfigに自動で記入されます。
つまりDebug.xcconfigはGenerated.xcconfigをincluedeすることで--dart-defineの値を使えます。
何が起きていたのか
ここからは挙動を見た限りの予想になってしまうのですが、Flutterアプリの起動時はDebug.xcconfigに直書きされたDART_DEFINESの値が使われ、restart時に本来の--dart-defineの値が使われていました。
まとめ
.xcconfigにDART_DEFINESの値を間違って直書きするとrestartまで値が取れない現象が発生します。
間違って直書きされたの自分がプロジェクトに入るよりかなり前だったため、気づくのに時間がかかりました😂