【问题标题】:Flutter Firebase Cloud Firestore get stream of list of documents by their idsFlutter Firebase Cloud Firestore 通过 id 获取文档列表流
【发布时间】:2021-11-19 02:07:57
【问题描述】:

大家好,我有两个顶级集合,一个用户集合和一个标签集合。在每个用户文档中,我有一个文档 ID 的数组字段,该数组中的每个元素代表选项卡集合中的一个文档(有点像一个引用或指向该文档的指针),我想听听实时变化带有 ID 列表的用户/文档,并监听选项卡集合中相应文档的更改。

以下是我目前的代码,它有两个问题。流无法在客户端工作 - 当我在云 Firestore 中更新文档时,我没有收到更新的快照。另外,为了让我获得 tabIds 的列表,我目前正在查询返回流的 cloud firestore,但是 whereIn 运算符仅接受对象列表,因此我不确定如何处理。

data model screenshot

     Stream<List<Tab>> get tabs {
      var tabIds = _db.collection('users').doc(user.uid).snapshots().where((event) => event.get('tabs'));
      return _db
      .collection('tabs')
      .where(FieldPath.documentId, whereIn: tabIds)
      .snapshots()
      .map((list) =>
        list.docs.map((doc) => Tab.fromJson(doc.data())).toList());
     }

【问题讨论】:

  • 对实际文本有强烈的偏好,在此处剪切和粘贴并格式化 - 如果只有这样 其他 人(stackEXCHANGE 和 stackOVERFLOW 的整个点)可以搜索类似的问题。绝对最低限度,图像应该张贴在这里。更好的是,剪切'n'粘贴您遇到困难的代码。
  • 我确实发布了一张图片,但我不确定它为什么嵌入到问题上方的链接中。就代码而言,这是我遇到困难的部分。我无法为上述问题生成可用的代码。我是 Firestore 和 Firebase 的新手。
  • 我们不是代码编写服务,因此我们需要查看您尝试过的代码,即使它不起作用。请花点时间查看How to create a Minimal, Complete, and Verifiable example。这个问题也有点不清楚 - 你想用 ID 列表来监听用户/文档的变化,还是你想使用该列表来监听选项卡集合中相应文档的变化?
  • 老实说,我想两者都做。
  • 请不要在 cmets 中发布代码;这是不可能的阅读。用您的代码更新 question 并解释它的作用 - 或者至少是您正在尝试做的事情。那我们就来看看吧!

标签: firebase flutter dart google-cloud-firestore stream


【解决方案1】:

你不能直接根据id来监听文档,但是你可以在每个文档中添加一个名为docId的字段(值应该是文档的id)然后用这个where条件监听集合。​​

List listOfDocIds = []; // this is the list of your docIds
StreamBuilder<QuerySnapshot<Map<String, dynamic>>>(
  stream: FirebaseFirestore.instance
            .collection('users')
            .where('docId', whereIn: listOfDocIds),
  builder: (BuildContext context,
      AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>> snapshot) {
    if (snapshot.hasError) return Text('Something went wrong');
    if (snapshot.connectionState == ConnectionState.waiting)
      return CircularProgressIndicator();

    List<Map<String, dynamic>> data =
        snapshot.data.docs.map((e) => e.data()).toList();
    print(data);
    // you can build your widget here
    return ListView.builder(
      itemCount: data.length,
      itemBuilder: (context, i) {
        return ListTile(
          title: Text(data[i]['name']),
          // TODO: change 'name' to name of field in users document
        );
      },
    );
  },
),

【讨论】:

  • 感谢彼得的回答,但我实际上想要获取的流是属于该用户的文档流的快照,而不是用户集合的快照。我有一个数组字段,其中包含另一个集合中文档的文档 ID,我想做的是能够监听对这些特定文档所做的任何更改。
  • 为了确保我正确理解您,您想收听 id 在列表中的文档吗?我已经更新了我的答案。它应该监听listOfDocIds 中所有文档的更改。看看吧。
  • 我尝试用一​​些有效的硬编码文档 ID 做一些非常相似的事情来测试它,但我的流似乎是空的。有没有这样的原因。下面是我的代码。它似乎不想进入我的地图功能
  • 我认为whereIn: Ids 应该是whereIn: tabIds;
  • 请注意 whereIn 有一些限制。 “您目前在查询中最多只能使用 10 个不同的值。”
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-05
  • 2018-04-14
相关资源
最近更新 更多