class Foo {
int count; // Error
void bar() => count = 0;
}
为什么我在bar
方法中已经初始化了,但还是看到一个错误?如果count
被标记为final
,我可以理解这个错误。
class Foo {
int count; // Error
void bar() => count = 0;
}
为什么我在bar
方法中已经初始化了,但还是看到一个错误?如果count
被标记为final
,我可以理解这个错误。
(在 Dart 2.12 之前,你的代码是没问题的,没有空值安全)
有了空值安全,Dart 不知道你是否真的给 count
赋了一个值。Dart 在两个阶段初始化对象,并且在构造函数体执行时,Dart 期望所有成员变量已经被初始化。因为你的成员变量是非空的,并且还没有被初始化为非空值,所以会出现错误。
int count = 0;
Foo(this.count);
Foo() : count = 0;
late
关键字:这意味着您承诺在任何尝试使用它们之前,变量将被初始化。
class Foo {
late int count; // No error
void bar() => count = 0;
}
class Foo {
int? count; // No error
void bar() => count = 0;
}
然而,这将要求所有访问在使用成员之前明确检查它们是否为null。
另请参阅:在Dart中立即或在构造函数中分配变量?
class Questionz {
late String questionText;
late bool questionAnswer;
Questionz({required String t, required bool a}) {
questionText = t;
questionAnswer = a;
}
}
String? myField;
double? _bmi; // adding ? to the double
String calculateBMI(){
_bmi=weight/pow(height/100, 2);
return _bmi!.toStringAsFixed(1);// adding ! to the private variable
}
String getResult(){
if(_bmi!>=25){ //adding ! to the private variable
return 'Overweight';
} else if (_bmi!>=18.5)
{
return 'normal';
}else{return 'underweight';}
如果您正在使用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!){}