我无法理解如何使用以下语句返回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,
};
}
}
谢谢你的帮助!
2条答案
按热度按时间atmip9wb1#
Iterable<E>.firstWhere
的签名为:也就是说,
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
。rm5edbpk2#
请尝试执行以下操作: