Dart中使用??=赋值运算符时报非空变量未初始化错误是什么原因?
The non-nullable local variable 'linus' must be assigned before it can be used. Try giving it an initializer expression, or ensure that it's assigned on every execution path.
报错根因
这个报错是Dart空安全(Null Safety)机制的强制校验导致的,核心原因两点:
- Dart 2.12及之后版本默认开启空安全,你声明的
int linus属于不可空类型,这类变量从语法规则层面就不允许为null,必须在声明时完成初始化,或者在使用前确保所有执行路径都已经给它赋值。 ??=赋值运算符的运行逻辑是:仅当左值为null时,才会将右值赋值给左值。对于不可空类型的linus来说,它不可能为null,所以??=在这里不会触发赋值逻辑,编译器会判定你在使用linus前没有完成赋值,因此抛出错误。
修复方案
如果你要使用??=实现null fallback的赋值逻辑,只需要把变量声明为可空类型即可,在类型后加?标记:
void main() { int? linus; // 声明为可空int类型,默认初始值为null linus ??= 100; // 此时linus为null,会正常赋值100 print(linus); }
如果你不需要变量可空,直接给不可空变量赋初始值即可,不需要使用??=:
void main() { int linus = 100; print(linus); }
你参考的旧教程使用的是未开启空安全的老版本Dart环境,老版本中默认类型允许为null,所以原代码可以正常运行,新版本开启空安全后需要遵守上述规则。
内容的提问来源于stack exchange,提问作者Diego Aaron
相关产品推荐
相关产品推荐

