我正在flutter中用firebase构建一个聊天应用程序,所以我创建了一个文件,将firebase数据库连接到我的应用程序:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:socket/services/user.dart';
class DatabaseService {
final String? uid;
DatabaseService({this.uid});
final CollectionReference userCollection =
FirebaseFirestore.instance.collection("users");
Future<void> saveUser(String name) async {
return await userCollection.doc(uid).set({'name': name});
}
AppUserData _userFromSnapshot(DocumentSnapshot snapshot) {
return AppUserData(name: snapshot['name'], uid: uid);
}
Stream<AppUserData> get user {
return userCollection.doc(uid).snapshots().map(_userFromSnapshot);
}
List<AppUserData> _userListFromSnapshot(QuerySnapshot snapshot) {
return snapshot.docs.map((doc) {
return _userFromSnapshot(doc);
}) as List<AppUserData>;
}
Future<List<AppUserData>> get users {
return userCollection.snapshots().map(_userListFromSnapshot);
}
}
下面是用户dart:
class AppUser {
final String? uid;
AppUser({this.uid});
}
class AppUserData {
final String? uid;
final String name;
AppUserData({this.uid, required this.name});
}
但是,我得到了错误
无法从函数“users”返回类型为“Stream〈List〉”的值,因为它的返回类型为“Future〈List〉”。
在functionFuture〈List〉获取用户。我没有真正在数据库和供应商的经验,所以我真的不明白这个错误意味着什么。你能帮助我吗?谢谢你提前。
**编辑:**我将Future<List<AppUserData>>
更改为Stream<List<AppUserData>>
,但出现错误
Can you Help?监听的_MapStream〈QuerySnapshot〈Map〈String,dynamic〉〉,List〉抛出了异常。
2条答案
按热度按时间dnph8jn41#
这只是一个类型规范问题,
snapshots()
是一个Stream
,所以尝试返回它时,方法返回应该与它匹配,将Future<List<AppUserData>>
更改为Stream<List<AppUserData>>
:oxf4rvwz2#
如果你想提取集合用户的信息,你可能不需要使用snapshot(),你可以使用get()。
当你使用snapshot()时,你创建了一个Stream,就像你在错误日志中看到的那样。使用get你只会得到一次集合的文档。如果你需要继续观察,你可能会发现流构建器的合理使用,或者数据流中的一个项目列表。我不确定你给这个类的使用。
这里你有一个相关的问题:What is the difference between getDocuments() and snapshots() in Firestore?