(* 您的代码在Dart 2.12之前是正常的,零安全性 *) 使用null安全,Dart不知道你是否真的给count.Dart initializes objects in two phases赋值了,并且Dart期望在构造函数体执行时所有成员变量都已经初始化了,因为你的成员是不可为空的,并且还没有初始化为非空值,所以这是一个错误。
1.在申报时:
int count = 0;
2.在初始化formals参数中:
Foo(this.count);
3.在初始化器列表中:
Foo() : count = 0;
4.使用late关键字:
这意味着您承诺变量将在任何尝试使用它们的操作之前被初始化。
class Foo {
late int count; // No error
void bar() => count = 0;
}
5.使变量可为空:
class Foo {
int? count; // No error
void bar() => count = 0;
}
4条答案
按热度按时间ifmq2ha21#
(* 您的代码在Dart 2.12之前是正常的,零安全性 *)
使用null安全,Dart不知道你是否真的给
count
.Dart initializes objects in two phases赋值了,并且Dart期望在构造函数体执行时所有成员变量都已经初始化了,因为你的成员是不可为空的,并且还没有初始化为非空值,所以这是一个错误。1.在申报时:
2.在初始化formals参数中:
3.在初始化器列表中:
4.使用
late
关键字:这意味着您承诺变量将在任何尝试使用它们的操作之前被初始化。
5.使变量可为空:
但是,这将要求所有访问在使用成员之前显式地检查它们是否为空。
另请参阅:Dart assigning to variable right away or in constructor?
dtcbnfnu2#
使用late关键字在首次读取变量时初始化变量,而不是在创建变量时初始化变量。
inkz8wg93#
在pubspec.yaml中,如果您使用:
environment: sdk: ">=2.12.0 <3.0.0"
更改为
environment: sdk: ">=2.7.0 <3.0.0"
2.12.0零位安全功能开启,2.7.0零位安全功能关闭
提示:不要手动复制更改
更多信息https://dart.dev/null-safety
对于空值安全,请在变量后使用
?
,如var a?
;使用变量时,请在变量后使用!
,如:if(a!){}
1tuwyuhd4#
在我的例子中,我发现给变量加上?和!很有帮助: