跳到主要内容

not_assigned_potentially_non_nullable_local_variable

不可为空的局部变量 '{0}' 必须在使用前赋值。

描述

#

当局部变量被引用且具有以下所有特征时,分析器会产生此诊断信息:

  • 具有一个潜在不可为空的类型。
  • 没有初始化器。
  • 未标记为 late
  • 基于确定性赋值的规范,分析器无法证明该局部变量在使用前已被赋值。

示例

#

以下代码会产生此诊断信息,因为 x 不能拥有 null 值,但在赋值前被引用了:

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 是一个有效值,那么将变量设为可为空。

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;
}