5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

--dart-defineで渡した値がrestartするまで反映されない謎現象に遭遇した話

Last updated at Posted at 2024-04-24

## はじめに
--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まで値が取れない現象が発生します。
間違って直書きされたの自分がプロジェクトに入るよりかなり前だったため、気づくのに時間がかかりました😂

おまけ

同じ現象の質問
https://stackoverflow.com/questions/76610810/flutter-dart-define-not-loading-on-first-build-only-on-hot-restart

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?