dart 首先列出错误状态:无元素

x7rlezfr  于 2023-03-05  发布在  其他
关注(0)|答案(7)|浏览(129)

我正在运行**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);
jv2fixgn

jv2fixgn1#

当没有匹配元素时,即当a == b对于list中的任何元素都不为真时,将发生这种情况,未指定 * 可选参数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 safety时应该也能更好地工作):

import 'package:collection/collection.dart';

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

更多信息请看firstWhereOrNull,感谢@EdwinLiu指出。

vktxenjb

vktxenjb2#

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

import 'package:collection/collection.dart';

void main() {

  final myList = [1, 2, 3];

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

  print(myElement); // null
}
bcs8qyzn

bcs8qyzn3#

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
qhhrdooz

qhhrdooz4#

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 arg,那么方法将使用它,并且如果没有元素匹配条件,那么方法将不会抛出任何异常,所以使用下面的代码来处理这种错误情况:

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'));
bqucvtff

bqucvtff5#

在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]

}
v7pvogib

v7pvogib6#

需要检查相关列表的itemCount参数,例如:itemCount:snapshot.data?.docs.length如果你的itemcount和上面一样,你必须先检查nullsafety,然后检查nullability。你的itemcount可能如下所示。itemCount:快照.数据?.文档.长度??0,
当然,在StreamBuilder中,您可以使用singleOrNull:snapshot.data!.docs.单一或空!['X'],

3j86kqsm

3j86kqsm7#

我在使用.first属性和空数组时遇到了这个问题。
要修复此问题,只需在使用.first之前检查数组是否为空:

示例:
OrderAddress(
        address: addressRepository.items.isEmpty
            ? null
            : addressRepository.items.first,
      ),

相关问题