我已将我的 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)
,我不确定它来自哪里。这可能是问题吗?
答案 0 :(得分:0)
所以实际上我完全误解了 !.
和 ?.
语法背后的含义。据我所知,!.
是一种强制转换语法,它告诉 Dart 对象不可为空。
出于某种原因,我打算使用 ?.
来访问可空对象。这解释了错误消息。我调整了代码,在我的 Flutter 小部件中使用 ?.
而不是 !.
,问题就解决了。
对我来说最令人困惑的部分是堆栈跟踪。堆栈跟踪指向我返回 StreamBuilder
小部件的代码行,但没有指向 !.
运算符在其 builder
方法中的使用。如果它真的指向正确的行就好了。
不幸的是,我仍然不明白为什么 item
的变量 null
在检查 item != null
时没有评估为真。我不确定这是否是调试器的问题,但我也尝试打印出表达式的结果,结果是一样的。