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

标签 firebase flutter dart google-cloud-firestore firebase-authentication

我有一个使用 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/

相关文章:

user-interface - 在volume_up和volume_down图标之间过渡

android - 冲突版本的Android Studio

flutter - 如何用 flutter 修复页脚中的小部件

dart - BottomNavigationBarItem 中添加的四个图标不起作用

flutter - 如何在 Flutter 中为 Text Widget 添加自定义删除线

Flutter Dio : How to Upload Image?

javascript - 如何强制 Firebase 实时数据库使用 WebSockets?

firebase - 将 firebase_ml_vision 添加到 flutter 引发错误 'Unknown type name ' FIRVisionCloudLabelDetector'

android - 无法解析 : com. google.firebase :firebase-core:16. 0.0

dart - 为按钮添加闪烁