gpt4 book ai didi

firebase - 如何在 Flutter 中基于 Future 结果构建 Stream?

转载 作者:IT王子 更新时间:2023-10-29 07:11:09 25 4
gpt4 key购买 nike

我有一个使用 Firebase 存储和谷歌登录的 Flutter 应用。我尝试执行的步骤非常简单:

1- 使用 Google 登录(完成)。

2- 获取当前用户 ID(完成)。

3- 在为流生成器构造流时使用用户 ID(问题)。

到目前为止,我所做的是使用 Future 获取当前用户 ID,然后在 Where 子句

中注入(inject)用户 Id

.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com