😇

【dart-define】.fromEnvironment() で取得できないパターン

2024/10/18に公開

結論

=> constが必須。(final等はNG)

例)

  • my.envに、hogeを定義
// my.env
hoge="HOGE!"

OK,NGパターン

  // OK
  const constHoge = String.fromEnvironment('hoge');
  print(constHoge); // => "HOGE!"

  // NG
  final finalHoge = String.fromEnvironment('hoge');  
  print(finalHoge); // => ""  

OK,NGパターン(Widgetで利用)

特に、Widgetからめて利用する際に、const定義せず利用して、取得できず、少しハマった。

  // OK
  const Text(String.fromEnvironment('hoge'); => "HOGE!"

  // NG
        Text(String.fromEnvironment('hoge'); => ""

AI回答

const と final の違いが、この動作の原因です。以下にその理由を詳しく説明します。

1. const の場合:
const キーワードを使うと、コンパイル時に定数として評価されます。Dart の String.fromEnvironment メソッドは、コンパイル時に環境変数を取得するため、const を使うことで環境変数の値が正しく取得されます。

dart
コードをコピーする
const constHoge = String.fromEnvironment('hoge');
この場合、constHoge 変数はコンパイル時に hoge 環境変数の値を取得します。

2. final の場合:
final は、実行時に初期化される変数です。しかし、String.fromEnvironment は Dart の コンパイル時の定数(環境変数)しか取得できません。final は実行時に評価されるため、この時点では環境変数は評価されず、結果として空文字列になります。

dart
コードをコピーする
final finalHoge = String.fromEnvironment('hoge');
この場合、finalHoge はコンパイル時の定数として評価されないため、デフォルトで空文字列が返されます。

まとめ:
const を使用すると、コンパイル時に String.fromEnvironment から環境変数の値を取得できます。
final は実行時に初期化されるため、String.fromEnvironment では正しい値が取得できません。

Discussion