如何基于Flutter中的Future结果构建Stream?

我有一个Flutter应用程序,它使用Firebase存储和google登录。我要执行的步骤非常简单:

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

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

3-为流构建器构建流时使用用户ID(问题)。

到目前为止,我所做的是使用a Future获取当前用户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应该返回的值?任何想法?

非常感谢

回答:

您永远都不应使用Future<Stream>,这是双重异步的,这是不必要的。只需返回一个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。它返回一个Stream,您可以使用yield

event;或在流上发出事件yield* streamOfEvents;

以上是 如何基于Flutter中的Future结果构建Stream? 的全部内容, 来源链接: utcz.com/qa/408144.html

回到顶部