メインコンテンツにスキップ

未代入_null許容_可能性_ローカル_変数

null許容の可能性のあるローカル変数 '{0}' は、使用する前に代入する必要があります。

説明

#

アナライザーが、ローカル変数がこれらのすべての特性を持つ場合にこの診断を生成します。

  • 型がnull許容の可能性ありである。
  • 初期化子がない。
  • lateとマークされていない。
  • アナライザーは、確定代入の仕様に基づいて、参照する前にローカル変数が代入されることを証明できません。

#

以下のコードは、xnull になることはありませんが、値が代入される前に参照されるため、この診断を生成します。

dart
String f() {
  int x;
  return x.toString();
}

以下のコードは、x への代入が実行されない可能性があるため、null になる可能性があるため、この診断を生成します。

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  return x * 2;
}

以下のコードは、確定代入分析に基づいて、x が値が代入されていない状態で参照されないことをアナライザーが証明できないため、この診断を生成します。

dart
int h(bool b) {
  int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}

一般的な修正

#

null が有効な値である場合は、変数をnull許容にしてください。

dart
String f() {
  int? x;
  return x!.toString();
}

null が有効な値ではなく、合理的なデフォルト値がある場合は、初期化子を追加してください。

dart
int g(bool b) {
  int x = 2;
  if (b) {
    x = 1;
  }
  return x * 2;
}

それ以外の場合は、値がアクセスされる前に、すべての可能なコードパスで値が代入されることを確認してください。

dart
int g(bool b) {
  int x;
  if (b) {
    x = 1;
  } else {
    x = 2;
  }
  return x * 2;
}

変数をlateとマークすることもできます。これにより診断は削除されますが、変数がアクセスされる前に値が代入されなかった場合は、実行時に例外がスローされます。このアプローチは、アナライザーが確定代入分析に基づいて証明できない場合でも、変数が常に代入されることが確実な場合にのみ使用してください。

dart
int h(bool b) {
  late int x;
  if (b) {
    x = 1;
  }
  if (b) {
    return x * 2;
  }
  return 0;
}