Dart 听起来空安全,空值上的 `!=` 报告错误。用于空值的空检查运算符

时间:2021-06-19 15:58:17

标签: flutter dart

我已将我的 Flutter 项目升级到较新的 Dart SDK 版本。我有一个可以返回空对象的实用程序,它看起来像这样(示例):

  static Item? getCurrentItem(List<Item> list, DateTime now) {
    return list.firstWhereOrNull((item) {
      return ItemUtils.hasItemStartedStarted(item, now) &&
          !ItemUtils.didItemFinish(item, now);
    });
  }

这个静态方法在一个实例中返回 null,稍后当我尝试这样做时:

final item = ItemUtils.getCurrentItem(items, now);
if (item != null && ItemUtils.someOtherMethod(item, now) {
  ...
}

代码在 StreamBuilder 内反复运行,我有一个 Timer 设置可以定期重新渲染它。

它抛出错误 Null check operator used on a null value。我检查了 item 变量的值,它是 null。但是 item != null 报告错误,为什么?我在调试器中检查了这个,是否可能是由于 StreamBuilder 导致的一些陈旧数据?

此代码以前有效。迁移工具使用 firstWhereOrNull 方法而不是 .firstWhere(...., orElse: () => null) ,我不确定它来自哪里。这可能是问题吗?

1 个答案:

答案 0 :(得分:0)

所以实际上我完全误解了 !.?. 语法背后的含义。据我所知,!. 是一种强制转换语法,它告诉 Dart 对象不可为空。

出于某种原因,我打算使用 ?. 来访问可空对象。这解释了错误消息。我调整了代码,在我的 Flutter 小部件中使用 ?. 而不是 !.,问题就解决了。

对我来说最令人困惑的部分是堆栈跟踪。堆栈跟踪指向我返回 StreamBuilder 小部件的代码行,但没有指向 !. 运算符在其 builder 方法中的使用。如果它真的指向正确的行就好了。

不幸的是,我仍然不明白为什么 item 的变量 null 在检查 item != null 时没有评估为真。我不确定这是否是调试器的问题,但我也尝试打印出表达式的结果,结果是一样的。