dart 访问列表索引的安全方法

yfwxisqw  于 2023-10-13  发布在  其他
关注(0)|答案(5)|浏览(94)

我是新来的
我很难找到一种易于阅读的方法来“安全地”访问任何索引处的List元素

final List<String> myList = <String>[]
myList.add("something")
// ...
String myGetter(int index) {
  // "heavy" way
  if (index < myList.length) {
    return myList[index]
  }

  return null;
}

如果我使用常规的[index]elementAt(index),并且index超出了边界,则会抛出RandeError
有没有一个方法,当索引无法到达时返回null?
对不起,如果双重张贴,但我试图找到信息没有任何成功,+不知道是否有一个(联合国)官方松弛/不和谐问这种“简单”的问题

ftf50wuq

ftf50wuq1#

Dart列表不允许无效索引。没有内置的方法来获得一个null时,尝试。不在平台库中。
你可以创建自己的helper函数(就像你已经做的那样):

T? tryGet<T>(List<T> list, int index) => 
    index < 0 || index >= list.length ? null : list[index];

(也要检查负指数)。
按照建议,您也可以将其添加为扩展方法:

extension ListGetExtension<T> on List<T> {
  T? tryGet(int index) =>
    index < 0 || index >= this.length ? null : this[index];
}

这可能会让它更好用。
(我建议不要做一些不好的事情,然后捕捉错误,至少当你可以很容易地检查它是否是坏的)。

pzfprimi

pzfprimi2#

您可以定义一个extension method来捕获RangeError并返回null

void main() {
  print([1, 2].get(3)); // display null
}

extension SafeLookup<E> on List<E> {
  E get(int index) {
    try {
      return this[index];
    } on RangeError {
      return null;
    }
  }
}
hfyxw5xn

hfyxw5xn3#

你可以试试这个

void main() {

  List<int> teste = [1, 2, 3, 4];

  print(teste.get(1));
}

extension ListExtension<E> on List<E> {
  dynamic get(int value) {
    return this.contains(value) ? value : null; 
  }
}
qnakjoqk

qnakjoqk4#

根据documentation
如果index超出范围,则抛出RangeError。
所以你可以使用try-catch块:

String myGetter(int index) {
   try {
      return myList[index]; 
   } 
   on RangeError {
  // Called when the index is out of bounds
      return null; 
   }
}

如果你想格外小心,我想你可以在最后放一个通用的catch(以捕获所有不是RangeError的抛出),但在这样一个简单的getter中,我认为这是不必要的:

[...]
 }catch (e) {
  // No specified type, handles all other types of error/exceptions
      return null;   
   }
[...]
4si2a6ki

4si2a6ki5#

现在你可以使用elementAtOrNull来创建一个列表,

YourList.elementAtOrNull(5)

https://api.dart.dev/stable/3.0.1/dart-collection/IterableExtensions/elementAtOrNull.html

相关问题