flutter 扑动|未行程的例外状况:状态错误:没有元素使用'firstWhere'和'orElse'

bq3bfh9z  于 2022-11-30  发布在  Flutter
关注(0)|答案(2)|浏览(319)

我无法理解如何使用以下语句返回null:下面是一个简单的方法:

@override
  Future<People> searchPeople({required String email}) async {
    var user = auth.FirebaseAuth.instance.currentUser;
    final docs = await FirebaseFirestore.instance
        .collection('users')
        .doc(user!.email)
        .collection('people')
        .where('hunting', isEqualTo: email)
        .get();

    final docData = docs.docs.map((doc) {
      return People.fromSnapshot(doc);
    });

    var res = docData.firstWhere(
      (element) => element.hunting == email,
      orElse: () => null, // The return type 'Null' isn't a 'People', as required by the closure's 
    );
    print(res);
    return res;
  }

问题是它抛出错误:* 返回类型"Null"不是闭包所要求得"People"*
我已经在这里读了很多答案,但是所有的例子和答案都只适用于返回类型string,int,等等...当类型是一个对象(People)时,如何处理null?已经尝试过使用集合:firstWhereOrNull,但错误仍然存在...
我的模型中是否有需要更改的地方?

class People extends Equatable {
  String? hunting;
  String? username;
  String? persona;

  People({
    this.hunting,
    this.username,
    this.persona,
  });

  @override
  List<Object?> get props => [hunting, username, persona];
  static People fromSnapshot(DocumentSnapshot snapshot) {
    People people = People(
      hunting: snapshot['hunting'],
      username: snapshot['username'],
      persona: snapshot['persona'],
    );
    return people;
  }

  Map<String, dynamic> toMap() {
    return {
      'hunter': hunting,
      'username': username,
      'persona': persona,
    };
  }
}

谢谢你的帮助!

atmip9wb

atmip9wb1#

Iterable<E>.firstWhere的签名为:

E firstWhere(bool test(E element), {E orElse()?})

也就是说,Iterable<E>.firstWhere必须返回E。它不能返回E?。如果E不可为空,则.firstWhere不能返回null。如Dart Null Safety FAQ中所述,如果要从.firstWhere返回null,则应使用package:collection中的firstWhereOrNull extension method
但是,您的searchPeople方法被声明为返回Future<People>,* 而不是 * Future<People?>。即使您使用firstWhereOrNull,您的searchPeople函数也不能合法地返回null。因此,您需要另外执行以下操作之一:

  • 变更searchPeople的传回型别(以及所有基底类别中的)。
  • 选择要返回的非空值,而不是null
  • 引发异常。
rm5edbpk

rm5edbpk2#

请尝试执行以下操作:

var res = docData.firstWhere((element) => element.hunting == email, orElse: () => People(username: 'Not Found', hunting: 'Not Found', persona: 'Not Found'));

相关问题