Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Dart空安全延迟加载_Dart_Dart Null Safety - Fatal编程技术网

使用Dart空安全延迟加载

使用Dart空安全延迟加载,dart,dart-null-safety,Dart,Dart Null Safety,我正在尝试将一些代码迁移到启用空安全性的Dart 2.12,但在找到迁移具有延迟加载/缓存值的方法的好方法时遇到了问题 Dart 2.12不会编译以下代码,除非我将getValue()的返回类型从MyObject更改为MyObject?。但是getValue()永远不会返回null 类MyObject{ // ... } 我的对象_缓存值; MyObject getValue(){ if(_cachedValue==null){ _cachedValue=MyObject(); //一些繁重的计

我正在尝试将一些代码迁移到启用空安全性的Dart 2.12,但在找到迁移具有延迟加载/缓存值的方法的好方法时遇到了问题

Dart 2.12不会编译以下代码,除非我将getValue()的返回类型从
MyObject
更改为
MyObject?
。但是
getValue()
永远不会返回
null

类MyObject{
// ...
}
我的对象_缓存值;
MyObject getValue(){
if(_cachedValue==null){
_cachedValue=MyObject();
//一些繁重的计算。。。
}
返回_cachedValue;
}
更新2021-03-17 根据我现在使用的答案和评论:

类MyObject{
// ...
}
MyObject_计算值(){
MyObject obj=MyObject();
//一些繁重的计算。。。
返回obj;
}
后期最终MyObject cachedValue=_computeValue();

如果您可以确保
\u cachedValue
在读取之前将被初始化,那么您可以使用
late
关键字,该关键字表示“这最终将有一个值,然后永远不会为空。同时,由我来确保在它有值之前我不会访问它”

在使用值初始化变量之前访问
late
变量将抛出错误

可选地,如果适当的话,可以考虑使用占位符值。< /P> 最后,您可以使用

以声明您确信某个值不为null。在您的情况下,这可能是最合适的解决方案。在
getValue()
中,您将
返回_cachedValue
而不是
返回_cachedValue

编辑:伊恩的答案也是很好的。
??=
操作员设法让我忘记了,即使我也在使用它


除此之外,您还有一个可空值,因此getter必须返回一个
MyObject?

您必须使用该语言的空安全特性来获得好的空安全代码

在本例中,我将
getValue
重写为:

MyObject getValue()=>\u cachedValue???=MyObject();

(在null安全之前我也会这样写,这是惰性初始化变量的惯用方法,它使用
null
表示未初始化)。

使用nnbd惰性初始化,您可以使用
late final
例如
late final cachedVaue=getValue()
getValue
只调用一次,首次调用
cachedValue
时。
 late MyObject _cachedValue;