Flutter 中的 Stream 和 Future

Posted

技术标签:

【中文标题】Flutter 中的 Stream 和 Future【英文标题】:Stream and Future in flutter 【发布时间】:2020-09-02 13:56:37 【问题描述】:

我使用 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'. 

我知道参数需要一个字符串,我不能分配一个未来,但我不知道如何将未来与流一起使用并解决问题。如果我用“36o1avWh8cLAn”(实际用户 ID)之类的字符串替换 currentUserId 变量,它确实有效。

任何帮助将不胜感激。

更新: 感谢 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】:

您可以使用 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();
    );


【讨论】:

非常感谢。有效。除了 async* 之外,我还必须将第一个 return 替换为 yield*。 是的,我确实忘记改变了。

以上是关于Flutter 中的 Stream 和 Future的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 中的 Stream 和 Future

Flutter 如何处理 Stream 和 Future 返回错误

Stream Builder 在 Flutter 中的先前数据之上更新数据

如何通过 Dart/Flutter 中的“application/octet-stream”将 png 文件发送到 Microsoft Custom Vision?

Flutter状态管理——单Stream和广播Stream

Flutter状态管理——单Stream和广播Stream