使用Dart空安全延迟加载
我正在尝试将一些代码迁移到启用空安全性的Dart 2.12,但在找到迁移具有延迟加载/缓存值的方法的好方法时遇到了问题 Dart 2.12不会编译以下代码,除非我将getValue()的返回类型从使用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(); //一些繁重的计
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;