-1

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

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

class MyObject {
  // ...
}

MyObject? _cachedValue;

MyObject getValue() {
  if (_cachedValue == null) {
    _cachedValue = MyObject();
    // some heavy computing...
  }
  return _cachedValue;
}

2021-03-17 更新

根据斯蒂芬的回答马蒂亚的评论,我现在正在使用:

class MyObject {
  // ...
}

MyObject _computeValue() {
  MyObject obj = MyObject();
  // some heavy computing...
  return obj;
}
late final MyObject cachedValue = _computeValue();
4

2 回答 2

2

如果您可以确保_cachedValue在读取之前将其初始化,那么您可以使用late关键字“这最终将有一个值,然后永远不会为空。同时由我来确保我不这样做”在它具有价值之前访问它”

 late MyObject _cachedValue;

late在使用值初始化之前访问变量将引发错误。

或者,如果合适的话,您可以考虑使用占位符值。

最后,您可以使用!断言您确定某个值不为空。在您的情况下,这可能是最合适的解决方案。在getValue()你会return _cachedValue!;而不是return _cachedValue;

编辑:Irn 的回答也不错。??=即使我也使用它,操作员也设法让我忘记了。

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

于 2021-03-16T19:13:44.370 回答
0

您必须使用该语言的 null 安全特性来获得漂亮的 null 安全代码。

在这种情况下,我将重写getValue为:

MyObject getValue() => _cachedValue ??= MyObject();

(我也会在 null 安全之前这样写,这是延迟初始化null用于表示未初始化的变量的惯用方式)。

于 2021-03-16T22:21:28.997 回答