【问题标题】:Flutter Firestore StreamBuilder on list of references参考列表上的 Flutter Firestore StreamBuilder
【发布时间】:2019-06-14 00:56:18
【问题描述】:

Firestore 数据库由一组用户组成。每个用户文档都有一些公共数据和一组他遵循的用户 ID,称为关注。在 Flutter 应用程序中,我想在以下数组上创建一个 StreamBuilder。因此,当用户将某人添加到他的以下数组时 - 它将被添加到流中,并且当以下列表中的用户更改他的数据时 - 流也会更新。

我想也许可以使用引用列表 ('users/usersid3') 而不是 ID 列表 ('userid3'),但我不知道如何实现它。

这就是数据库的结构。

users
      - user1id
            - some public data
            - following: [user2id, user3id]
      - user2id
            - some public data
            - following: []
      - user3id
            - some public data
            - following: [user2id]

【问题讨论】:

  • 这个答案有帮助吗? stackoverflow.com/a/50553853/10747134
  • @OneLunchMan 感谢您的参考,但我看不出这有什么帮助。该答案解释了如何以基本形式使用 StreamBuilder 。正如我在问题中解释的那样,我需要将它用于从集合中选择的文档。
  • 哦,我看到了更多问题。因此 Firebase 不喜欢在数组中使用“更改”,因此使用您想要的信息将其制作为跟随 ID 的映射会更容易。从那里,为一个用户使用流构建器(而不是集合,它是一个文档引用,但基本上是相同的代码),并将返回的文档传递给您的显示组件,该组件可以处理来自地图键的列表项。
  • @OneLunchMan 我喜欢你的想法。我忘了说有很多用户在关注其他人,这意味着我们很好地在用户关注地图中保存了公共数据的多个副本,并且每次有人更改他的公共数据时都会进行大量更新(=存储和写入成本高昂)。

标签: firebase flutter google-cloud-firestore


【解决方案1】:

所以,有一个解决方法可以解决这个问题。

  1. 我将以下列表作为地图(名为“followingMap”)保存在单独的文档“followingDoc”中)。
  2. 在该文档上使用了 StreamBuilder:
StreamBuilder(
  stream: Firestore.instance.collection('users').document(uid).collection('data').document('followingDoc').snapshots(),
  builder: (context, snapshot) {
    if (!snapshot.hasData) return Text("No data");
    return ListView.builder(
      itemCount: snapshot.data['followingMap'].keys.toList().length,
      itemBuilder: (BuildContext context, int index) {
        return followingItemWidget(id: snapshot.data['followingMap'].keys.toList()[index]);
      }
    );
  },
)
  1. 最后我创建了一个名为“followingItemWidget”的小部件,该小部件在我关注的用户的文档上有一个 StreamBuilder。

这非常有效,尽管我相信应该有一种方法可以只使用一个 StreamBuilder。

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 2020-10-26
    • 2020-05-28
    • 2020-06-07
    • 1970-01-01
    • 2019-05-10
    • 2019-10-01
    • 2021-02-26
    • 2021-09-23
    相关资源
    最近更新 更多