【问题标题】:Null-aware operator with Lists具有列表的 Null 感知运算符
【发布时间】:2020-09-09 12:05:20
【问题描述】:

Dart 中,null-aware 运算符与 ?? 运算符结合使用的方法效果不佳。

具有如下调用链的图像:

object.getter.getter.getter.getter

现在当object 可能为空并且我不希望出现异常时,我必须这样写:

object?.getter?.getter?.getter?.getter

这是对每个 getter 的空检查,即使只有 object 可以为空,但 getter 显然不起作用。

我没问题。但现在我有一个场景,如果为 null,我想返回另一个值,但我正在使用一个列表:

list[index][index][index]

如何在 List getter 上使用可识别 null 的运算符?

这不起作用:

list?[index]

这对于 Dart 中的 List 不存在。

list?.get(index)

我想实现这样的目标:

list?[index]?[index]?[index] ?? 0

我知道只有list 永远是null

这个代码可以工作:

list == null ? 0 : list[index][index][index]

【问题讨论】:

    标签: dart


    【解决方案1】:

    索引运算符没有可识别空值的运算符 ([])

    您可以改用elementAt()

    list?.elementAt(index)?.elementAt(index)?.elementAt(index) ?? 0
    

    更新 - 2021/05/24

    如果您使用的是 null-safety,您现在可以使用这个:

    list?[index]?[index]?[index] ?? 0
    

    【讨论】:

    • 这就是我一直在寻找的。我不得不说我发现自己很难为 Dart 研究这些答案。附带问题:是否也有类似异常感知运算符的东西?因为在List's 上的索引可能超出范围并且它不会返回null,但是会抛出异常。
    • 不,没有异常感知运算符。你必须使用try-catch。您可以自己创建一个函数来捕获异常并返回 null T exceptionAware<T>(T Function() f) { try { return f(); } catch(_) { return null; }) 并像 var result = exceptionAware<int>(() => list[index][index][index]) ?? 0; 一样使用它。不过,我并不是说这样做是个好主意 ;-)
    • 不,elementAt(index)?. 仅在 index 的元素是值 null 时才有帮助。
    • 最后,我在你的评论中使用exceptionAwareval url = exceptionAware<String>(() => list?.first?.url);仅在一行代码中获取值而无需进行 if 检查,谢谢
    • 另一个受 Kotlin 启发的解决方案 List.firstOrNull 扩展函数: /// 返回第一个元素,如果列表为空,则返回 null。 T firstOrNull(List list) { if (list.isEmpty) { return null; } else { 返回列表.first; } }
    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 2021-05-10
    • 2021-06-12
    • 2022-12-16
    • 2020-02-17
    • 2017-12-14
    • 1970-01-01
    相关资源
    最近更新 更多