我有一个使用 Firebase 存储和谷歌登录的 Flutter 应用。 我尝试执行的步骤非常简单:
1- 使用 Google 登录(完成)。
2- 获取当前用户 ID(完成)。
3- 在为流生成器构造流时使用用户 ID(问题)。
到目前为止,我所做的是使用 Future
获取当前用户 ID,
然后在 Where 子句
.where('userId', isEqualTo: userId)
这就是我最终得到的:
这是我应该创建流的部分:
// Get document's snapshots and return it as stream.
Future<Stream> getDataStreamSnapshots() async {
// Get current user.
final User user = await FirebaseAuth().currentUser();
String userId = user.uid;
Stream<QuerySnapshot> snapshots =
db
.collection(db)
.where("uid", isEqualTo: userId)
.snapshots();
try {
return snapshots;
} catch(e) {
print(e);
return null;
}
}
这是我应该调用和接收流的部分,
...
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: CALLING THE PREVIOUS FUNCTION,
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
...
}
...
但是这段代码不起作用,因为我无法获得 Future 应该返回的值?有什么想法吗?
非常感谢
最佳答案
你永远不应该有 Future<Stream>
,那是双异步,这是不必要的。只需返回 Stream
,然后在您准备好之前不必发出任何事件。
不清楚 try
是什么/catch
正在守卫,因为非 Future
的返回不能扔。如果您返回一个流,也只需在该流上发出任何错误。
您可以将代码重写为:
Stream<QuerySnapshot> getDataStreamSnapshots() async* {
// Get current user.
final User user = await FirebaseAuth().currentUser();
String userId = user.uid;
yield* db
.collection(db)
.where("uid", isEqualTo: userId)
.snapshots();
}
安async*
函数是异步的,所以你可以使用 await
.它返回 Stream
,然后使用 yield event;
在流上发出事件或 yield* streamOfEvents;
.
关于firebase - 如何在 Flutter 中基于 Future 结果构建 Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56759571/