我有一个Flutter应用程序,它使用Firebase存储和google登录。我要执行的步骤非常简单:
1-使用Google登录(完成)。
2-获取当前用户ID(完成)。
3-为流构建器构建流时使用用户ID(问题)。
到目前为止,我所做的是使用a Future获取当前用户ID,然后将用户ID注入到Where clause
Future
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,然后在准备就绪之前不必发出任何事件。
Future<Stream>
Stream
目前尚不清楚try/ catch在保护什么,因为返回non- Future不会抛出异常。如果返回流,则也要在流上发出任何错误。
try
catch
您可以将代码重写为:
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;。
async*
await
yield event;
yield* streamOfEvents;