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 返回错误
Stream Builder 在 Flutter 中的先前数据之上更新数据
如何通过 Dart/Flutter 中的“application/octet-stream”将 png 文件发送到 Microsoft Custom Vision?