具有列表的空感知运算符

cre*_*not 8 dart

Dart中,与方法结合使用的方法的null感知运算??符不能很好地工作。

具有如下调用链的图像:

object.getter.getter.getter.getter
Run Code Online (Sandbox Code Playgroud)

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

object?.getter?.getter?.getter?.getter
Run Code Online (Sandbox Code Playgroud)

尽管每个吸气剂只能object为空,但这是一个空检查,但是getter显然不起作用。

我对此很好。但是现在我有一个场景,我想在返回null时返回另一个值,但是我正在使用列表:

list[index][index][index]
Run Code Online (Sandbox Code Playgroud)

如何在List getter上使用null感知运算符?

这不起作用:

list?[index]
Run Code Online (Sandbox Code Playgroud)

而这个不存在List的在飞镖

list?.get(index)
Run Code Online (Sandbox Code Playgroud)

我想实现以下目标:

list?[index]?[index]?[index] ?? 0
Run Code Online (Sandbox Code Playgroud)

我知道只有list这样的地方null

这个代码可以正常工作:

list == null ? 0 : list[index][index][index]
Run Code Online (Sandbox Code Playgroud)

Gün*_*uer 16

索引运算符([])没有空感知运算符

您可以elementAt()改用:

list?.elementAt(index)?.elementAt(index)?.elementAt(index) ?? 0
Run Code Online (Sandbox Code Playgroud)

  • 不,`elementAt(index)?.`仅在index处的元素为null时才有用。 (4认同)
  • 不,没有异常感知运算符。您必须使用`try-catch`。您可以自己创建一个捕获异常并返回`null`的函数。T exceptionAware <T>(T Function()f){try {return f(); } catch(_){返回null;})并像`var result = exceptionAware <int>(()=> list [index] [index] [index])一样使用它?0;`。我并不是说这样做是个好主意;-) (3认同)
  • 这就是我一直在寻找的。我不得不说我发现自己很难为 *Dart* 研究这些答案。附带问题:是否也有类似异常感知运算符的东西?因为在`List` 上,索引可能超出范围并且它不返回`null`,但会抛出异常。 (2认同)
  • 另一个受 Kotlin `List.firstOrNull` 扩展函数启发的解决方案: /// 返回第一个元素,如果列表为空,则返回 `null`。T firstOrNull<T>(List<T> list) { if (list.isEmpty) { return null; } else { 返回列表.first; } } (2认同)