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

iDe*_*ode 12 dart dart-null-safety

class Foo {
  int count; // Error
  void bar() => count = 0;
}
Run Code Online (Sandbox Code Playgroud)

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

iDe*_*ode 30

你的代码在 Dart 2.12 之前很好,空安全

有了空安全,Dart 无法知道你是否真的为count. Dart 可以通过三种方式看到初始化:

  1. 申报时:

    int count = 0;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在初始化形式中:

    Foo(this.count);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在初始化列表中:

    Foo() : count = 0;
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 使用late关键字:

    class Foo {
      late int count; // No error
      void bar() => count = 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使变量可以为空

    class Foo {
      int? count; // No error
      void bar() => count = 0;
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 9

使用 Late 关键字在首次读取变量时(而不是创建变量时)对其进行初始化。

class Questionz {
    late String questionText;
    late bool questionAnswer;

    Questionz({required String t, required bool a}) {
        questionText = t;
        questionAnswer = a;
    }
}
Run Code Online (Sandbox Code Playgroud)