【问题标题】:Unable to return list of object from firebase Stream query无法从 firebase Stream 查询返回对象列表
【发布时间】:2020-12-07 12:59:40
【问题描述】:

我正在做一个 firebase 查询,它必须将对象列表作为流返回。因此,为了实现这一目标,我使用 Async* 等待我的循环 for 完成,然后再继续该过程。 但问题是,我的函数在If 条件下停止并且没有进入他的for 循环并且我的函数没有返回任何内容。 欢迎您的帮助。

这是我的代码

Stream<List<InfoCompagnie>> fetchCompanies(
    String depart, String arrivee, String jour, int place) async* {
  var q = await db.collection('DISPONIBILITE').snapshots();
  await for (var q1 in q) {
    for (var compagnies in q1.documents) {
      var NomCompagnie = compagnies.data[firstCaseDate];
      for (var compagnie in NomCompagnie) {
        await for (var q2 in qq) {
          if (q2.documents.isNotEmpty) {
            //Making condition here
            for (var data in q2.documents) {
              await compagnieList
                  .add(infoCompagnie.value); //add Object here into list
            } 
            yield compagnieList; //return stream data here
          }//Function stopped here
        }
      }
    }
  }
}

【问题讨论】:

  • 如果您删除了if 语句,您的代码可以正常工作吗?
  • No @J.A.Hernández 它给我带来了一个错误,因为我们无法从空文档中迭代。
  • 你不需要等待流,只需要等待。事实上,你可能根本不需要在这里等待
  • 是 @lenz 删除 await 关键字后它起作用了。谢谢
  • 谢谢@lenz 这很有帮助。

标签: flutter google-cloud-firestore async-await


【解决方案1】:

您应该只等待期货,而不是流。

这里await 在您的大部分代码中不是必需的,因为db.collection('DISPONIBILITE').snapshots() 返回一个流。你的其余代码似乎是同步的。除了compagnieList.add(infoCompagnie.value),这是一个未来,需要await

Future 表示不会立即完成的计算。在普通函数返回结果的地方,异步函数返回一个 Future,它最终将包含结果。当结果准备好时,未来会告诉你。

流是一系列异步事件。它就像一个 异步Iterable——在哪里,而不是在何时获取下一个事件 你要求它,“当它准备好时,流会告诉你有一个事件。”

最后一行也解释了为什么你不应该等待流:流告诉你当它准备好时有一个事件。

source

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多