dart 必须初始化不可为空的示例字段

o2g1uqev  于 2023-03-21  发布在  其他
关注(0)|答案(4)|浏览(180)
class Foo {
  int count; // Error
  void bar() => count = 0;
}

为什么我已经在bar方法中初始化它时看到一个错误?如果count被标记为final,我可以理解这个错误。

ifmq2ha2

ifmq2ha21#

(* 您的代码在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;
}

但是,这将要求所有访问在使用成员之前显式地检查它们是否为空。
另请参阅:Dart assigning to variable right away or in constructor?

dtcbnfnu

dtcbnfnu2#

使用late关键字在首次读取变量时初始化变量,而不是在创建变量时初始化变量。

class Questionz {
    late String questionText;
    late bool questionAnswer;

    Questionz({required String t, required bool a}) {
        questionText = t;
        questionAnswer = a;
    }
}
inkz8wg9

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!){}

1tuwyuhd

1tuwyuhd4#

在我的例子中,我发现给变量加上?和!很有帮助:

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

相关问题