Jeh*_*ser 5 dart firebase firebase-authentication flutter google-cloud-firestore
我有一个 Flutter 应用程序,它使用 Firebase-storage 和 google-signin。我正在尝试执行的步骤非常简单:
1- 使用 Google 登录(完成)。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我应该调用和接收流的部分,
...
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: CALLING THE PREVIOUS FUNCTION,
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasData) {
...
}
...
Run Code Online (Sandbox Code Playgroud)
但是这段代码不起作用,因为我无法获得 Future 应该返回的值?任何的想法?
多谢
lrn*_*lrn 12
你永远不应该有一个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();
}
Run Code Online (Sandbox Code Playgroud)
一个async*功能是异步的,所以你可以使用await。它返回 a Stream,然后您使用yield event;or在流上发出事件yield* streamOfEvents;。
| 归档时间: |
|
| 查看次数: |
3096 次 |
| 最近记录: |