dart列表元素中存在空值

eqqqjvef  于 2022-12-06  发布在  其他
关注(0)|答案(3)|浏览(140)

I was working on a project and wanted to check if a list element was null. Example

List<int> i = [1, 2, 3];
print(i[1]); // this prints 2

But what if I want to print out a list element and if it does not exist print out a default number using dart null-aware. Example

List<int> i = [1, 2, 3];
print(i[10] ?? 15);
// Also tried
print(i?.elementAt(10) ?? 15);

I want it to print out 15 since the element at index 10 does not exist. Unfortunately, the above code gives me an error.
How can I check if a list element does not exist and return a default value

jv2fixgn

jv2fixgn1#

您必须首先检查列表长度,因为在程序计算i.elementAt(10)时,它会立即抛出RangeError异常。

示例解决方案1:

if (i.length > 9) { 
    print(i?.elementAt(10));
} else {
    print(15);
}

示例解决方案2(更优雅的方式):

print(i.length > 9 ? i?.elementAt(10) : 15);
kt06eoxx

kt06eoxx2#

拥有这种功能的一个解决方案是用一个自定义类 Package 您的列表,该类捕获内部异常并返回null。
我在下面编写了这个 Package 器,并将其命名为XList:

class XList<E> {
  List<E> list;
  XList(this.list);
  E operator [](int position) {
    try {
      return list[position];
    } catch(IndexOutOfBoundException) {
      return null;
    }
  }
}

现在,您的代码的工作方式如下:

final list = [1, 2, 3];
final a = XList(list);
print(a[10] ?? 15);
// prints 15
csga3l58

csga3l583#

您可以在Iterable上创建一个扩展,以便在提供的索引超出范围时轻松地拥有一个返回null的方法:

extension SafeAccess<T> on Iterable<T> {
  T? safeElementAt(int index) => this.length <= index ? null : this.elementAt(index);
}

您可以将它放在代码库中一个通用文件(如lib/extensions/iterable_extensions.dart)中,然后在需要时将其导入。

相关问题