我正在使用Firebase作为后端。每个用户都有一些项目,而其他用户看不到这些项目。用户项目存储在子集合中。结构是这样的: 用户集合->用户ID作为文档ID->在每个文档中,项目的子集合->项目作为文档。
该应用需要从Firestore获取用户ID,然后它才能显示该用户的项目。
@override
Stream<List<Item>> items() {
final currentUserId = userRepo.getUserUid();
return Firestore.instance.collection('users')
.document(currentUserId) //error here
.collection("items").snapshots().map((snapshot) {
return snapshot.documents
.map((doc) => Item.fromEntity(ItemEntity.fromSnapshot(doc)))
.toList();
});
}
Future<String> getUserUid() async {
return (await _firebaseAuth.currentUser()).uid;
}
currentUser引发以下错误:
The argument type 'Future<String>' can't be assigned to the parameter type 'String'.
我了解该参数需要一个String,并且我无法分配Future,但是我不知道如何将Future与流一起使用并解决问题。如果我将currentUserId变量替换为“ 36o1avWh8cLAn”(实际的用户ID)之类的字符串,它将起作用。
任何帮助将不胜感激。
更新: 多亏了Viren V Varasadiya,问题得以解决。
@override
Stream<List<Item>> items() async*{
final currentUserId = userRepo.getUserUid();
yield* Firestore.instance.collection('users')
.document(currentUserId) //error here
.collection("items").snapshots().map((snapshot) {
return snapshot.documents
.map((doc) => Item.fromEntity(ItemEntity.fromSnapshot(doc)))
.toList();
});
}
答案 0 :(得分:1)
您可以使用async *批注在返回流的函数中使用await。
Stream<List<Item>> items() async*{
final currentUserId = await userRepo.getUserUid();
yield Firestore.instance.collection('users')
.document(currentUserId) //error here
.collection("items").snapshots().map((snapshot) {
return snapshot.documents
.map((doc) => Item.fromEntity(ItemEntity.fromSnapshot(doc)))
.toList();
});
}