【问题标题】:Non-nullable instance field must be initialized必须初始化不可为空的实例字段
【发布时间】:2021-07-06 02:57:10
【问题描述】:
class Foo {
  int count; // Error
  void bar() => count = 0;
}

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

【问题讨论】:

    标签: dart dart-null-safety


    【解决方案1】:

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

    使用 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;
      }
      

    【讨论】:

      【解决方案2】:

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

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

      确保在你的变量之前放late

      【讨论】:

      • 首先,我已经提到了late关键字,其次没有理由放置多个变量来显示相同​​的东西。
      • 我在编码的时候看到了。这就是为什么我把它和提及
      • 你看到了什么,late 关键字?它已经在我的答案中了。您的答案没有提供任何新内容。因此,您可以考虑删除它(以良好的精神),但选择权始终在您手中。
      【解决方案3】:

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

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

      【讨论】:

      • 我已经在回答中提到了这一点。抱歉,您的帖子中没有新内容。
      【解决方案4】:

      在我的情况下,我发现给予?和 !对变量有帮助:

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

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案5】:

      如果您使用的是 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!){}

      【讨论】:

      • 所以,你基本上是在告诉我选择退出 null 安全性?抱歉,这不是我要找的东西!
      • 你的电话兄弟......我不希望项目中的 null 安全性 amd 得到同样的错误
      • 为了安全使用?像var a这样的变量之后?并在使用时,使用!在变量之后,比如:if(a!)
      • 首先,如果没有零安全,你能在那里呆多久?其次,我已经在回答中提供了该解决方案。
      • 我的错误是,由于等待,然后在 ascyn 函数中,我从另一个类中获取值,该类返回未来,所以错误是你不能返回一个变量?因为 await 然后 ....
      猜你喜欢
      • 1970-01-01
      • 2021-09-14
      • 2021-09-24
      • 2021-10-11
      • 2021-08-27
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多