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

Non-nullable instance field must be initialized

class Foo {
  int count; // Error
  void bar() => count = 0;
}

为什么我已经在 bar 方法中初始化它时看到错误?如果 count 被标记为 final.

,我可以理解这个错误

(您的代码在 Dart 2.12 之前没有问题,null 安全)

使用空安全,Dart 无法知道您是否真的将变量分配给 count。 Dart 可以通过三种方式查看初始化:

  1. 申报时:

    int count = 0;
    
  2. 在初始化形式中:

    Foo(this.count);
    
  3. 在初始化列表中:

    Foo() : count = 0;
    

因此,根据 Dart,count 从未在您的代码中初始化,因此出现错误。解决方案是用上面显示的 3 种方式初始化它,或者只使用 late 关键字,它会告诉 Dart 您将在使用它之前的某个其他时间点初始化变量。

  1. 使用late关键字:

    class Foo {
      late int count; // No error
      void bar() => count = 0;
    }
    
  2. 使变量可为空:

    class Foo {
      int? count; // No error
      void bar() => count = 0;
    }
    

这些是 Dart 关于空安全的新规则

class Note {
  late int _id;
  late String _title;
  late String? _description;
  late String _date;
  late int _priority;
}

确保在你的变量之前输入 late

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

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

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

在我的例子中,我发现给予了?和 !对变量有帮助:

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