【发布时间】:2021-07-06 02:57:10
【问题描述】:
class Foo {
int count; // Error
void bar() => count = 0;
}
为什么我已经在 bar 方法中初始化它时看到错误?如果count 被标记为final,我可以理解这个错误。
【问题讨论】:
标签: dart dart-null-safety
class Foo {
int count; // Error
void bar() => count = 0;
}
为什么我已经在 bar 方法中初始化它时看到错误?如果count 被标记为final,我可以理解这个错误。
【问题讨论】:
标签: dart dart-null-safety
(你的代码在 Dart 2.12 之前很好,null 安全)
使用 null 安全性,Dart 无法知道您是否实际上已将变量分配给 count。 Dart 可以通过三种方式查看初始化:
申报时:
int count = 0;
在初始化形式中:
Foo(this.count);
在初始化列表中:
Foo() : count = 0;
因此,根据 Dart 的说法,count 从未在您的代码中初始化,因此出现了错误。解决方案是用上面显示的 3 种方式初始化它,或者只使用 late 关键字,这将告诉 Dart 你将在使用它之前的某个其他点初始化变量。
使用late 关键字:
class Foo {
late int count; // No error
void bar() => count = 0;
}
使变量可以为空:
class Foo {
int? count; // No error
void bar() => count = 0;
}
【讨论】:
这些是关于 Dart 的关于 null 安全性的新规则
class Note {
late int _id;
late String _title;
late String? _description;
late String _date;
late int _priority;
}
确保在你的变量之前放late
【讨论】:
late关键字,其次没有理由放置多个变量来显示相同的东西。
late 关键字?它已经在我的答案中了。您的答案没有提供任何新内容。因此,您可以考虑删除它(以良好的精神),但选择权始终在您手中。
在我的情况下,我发现给予?和 !对变量有帮助:
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 null 安全功能已关闭
提示:不要手动复制更改
更多信息https://dart.dev/null-safety
为了 null 安全,在变量之后使用 ?,例如 var a?,而在使用变量时,在变量之后使用 !,例如:if(a!){}
【讨论】: