扑朔迷离的未来

时间:2020-05-16 17:59:41

标签: firebase flutter

我正在使用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();
});
  }

1 个答案:

答案 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();
    });
}