列出 firstWhere 糟糕的状态: 没有元素

我正在运行 list.firstWhere,这有时会抛出一个异常:

Bad State: No element


When the exception was thrown, this was the stack:
#0      _ListBase&Object&ListMixin.firstWhere (dart:collection/list.dart:148:5)

我不明白这意味着什么也不能确定的问题,通过寻找 在源头

我的 firstWhere是这样的:

list.firstWhere((element) => a == b);
110203 次浏览

当没有匹配的元素时就会发生这种情况,也就是说,当 list 还有中的任何元素的 a == b都不为真时,就没有指定 可选参数 orElse

您也可以指定 orElse来处理这种情况:

list.firstWhere((a) => a == b, orElse: () => print('No matching element.'));

如果你想返回 null,而不是当没有匹配时,你也可以这样做与 orElse:

list.firstWhere((a) => a == b, orElse: () => null);

package:collection 还包含一个方便的 null情况下的扩展方法(这也应该与 null 安全更好地工作) :

import 'package:collection/collection.dart';


list.firstWhereOrNull((element) => element == other);

请参阅 firstWhereOrNull了解更多信息。感谢 @ EdwinLiu指出这一点。

firstWhere返回根据条件生成的 newList

void main() {
List<String> list = ['red', 'yellow', 'pink', 'blue'];
var newList = list.firstWhere((element) => element == 'green',
orElse: () => 'No matching color found');
print(newList);
}

产出:

No matching color found

或者

 void main() {
List<String> list = ['red', 'yellow', 'pink', 'blue'];
var newList = list.firstWhere((element) => element == 'blue',
orElse: () => 'No matching color found');
print(newList);
}

产出:

blue

如果在代码中没有定义 orElse,并且列表中不存在错误的条目获得搜索,那么它将显示 BadStateException

 void main() {
List<String> list = ['red', 'yellow', 'pink', 'blue'];
var newList = list.firstWhere((element) => element == 'green');
print(newList);
}

产出:

Uncaught Error: Bad state: No element

firstWhere()的实现如下:

  E firstWhere(bool test(E element), {E orElse()?}) {
for (E element in this) {
if (test(element)) return element;
}
if (orElse != null) return orElse();
throw IterableElementError.noElement();
}

因此,如您所见,如果定义了 orElse参数,那么方法将使用该参数,并且如果没有任何元素与条件匹配,则不会引发任何异常。因此,使用下面的代码来处理错误的情况:

list.firstWhere((element) => a == b, orElse: () => null); // To return null if no elements match
list.firstWhere((element) => a == b, orElse: () => print('No elements matched the condition'));

在 dart 2.10上有一个叫做 null-safety的新特性,当你有一个对象列表并且你想对一个特定对象的属性做一些事情的时候,这个特性可以为你变魔术:

class User {
String name;
int age;


User(this.name, this.age);


@override
String toString() {
return  'name:$name, age:$age';
}


}


void main() {
List<User?> users = [User("Ali", 20), User("Mammad", 40)];
print(users.toString()); // -> [name:Ali, age:20, name:Mammad, age:40]
// modify user age who it's name is Ali:
users.firstWhere((element) => element?.name == "Ali")?.age = 30;
print(users.toString()); // -> [name:Ali, age:30, name:Mammad, age:40]
// modify a user that doesn't exist:
users.firstWhere((element) => element?.name == "AliReza", orElse: ()=> null)?.age = 30; // doesn't find and works fine
print(users.toString()); // -> [name:Ali, age:30, name:Mammad, age:40]


}


现在可以导入 package:collection并使用扩展方法 firstWherNull

import 'package:collection/collection.dart';


void main() {


final myList = [1, 2, 3];


final myElement = myList.firstWhereOrNull((a) => a == 4);


print(myElement); // null
}

您需要检查相关列表的 itemCount 参数。 例如: Data.docs.length 如果你的项目数量和上面一样,你必须先检查空安全性,然后再检查空性。您的项目数可能如下所示。 Data.docs.length? ? 0,

当然,在 StreamBuilder 中你可以使用 singleOrNull: Data! . docs.singleOrNull! [‘ X’] ,