必须初始化不可为空的实例字段
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”