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

Posted

技术标签:

【中文标题】必须初始化不可为空的实例字段【英文标题】: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,我可以理解这个错误。

【问题讨论】:

【参考方案1】:

你的代码在 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;
    
    

【讨论】:

【参考方案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';
    elsereturn '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 然后 ....

以上是关于必须初始化不可为空的实例字段的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

为啥我收到警告说必须初始化一个不可为空的字段(当我确定我正在初始化它时)?

颤振错误->必须初始化不可为空的“项目”

声明为不可为空的 Kotlin 属性即使具有初始化值也可以为空