firebase - 如何在 Flutter 中基于 Future 结果构建 Stream?
问题描述
我有一个使用 Firebase-storage 和 google-signin 的 Flutter 应用程序。我想做的步骤很简单:
1- 使用谷歌登录(完成)。
2- 获取当前用户 ID(完成)。
3-在为流构建器构建流时使用用户 ID(问题)。
到目前为止我所做的是我使用 aFuture
来获取当前用户 ID,然后将用户 ID 注入到Where clause
.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 应该返回的值?任何想法?
多谢
解决方案
你永远不应该有 a Future<Stream>
,那是双异步,这是不必要的。只需返回 a Stream
,然后您就不必发出任何事件,直到您准备好。
目前尚不清楚try
/catch
正在保护什么,因为 non- 的返回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
. 它返回 a ,然后您使用orStream
在流上发出事件。yield event;
yield* streamOfEvents;
推荐阅读
- python - 字符串 Python 2.7 中的 Unicode 文字
- javascript - Chart.js 不会显示第二行
- powershell - 在 Citrix Receiver/Workspace 的 ICA 客户端对象 API 中,设置 OutputMode 真的有效吗?
- java - Stax 解析两次
- spring - Spring Boot中的Hibernate Search集成测试问题
- time-series - Python时间序列拆分
- asp.net-core - 如何从 NuGet 安装 Microsoft.AspNetCore.Mvc.Core 版本 3.1.0?
- java - 如何使用 java-11(或 corretto-11)解决 java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter?
- python - Dask 中是否有类似共享内存的东西用于大型对象多处理作业?
- java - 无法找到错误 - 使用递归的二进制搜索