【问题标题】:Flutter StreamBuilder to query sub-collection of document in a sub-collection in FirestoreFlutter StreamBuilder在Firestore的子集合中查询文档的子集合
【发布时间】:2020-12-02 10:48:51
【问题描述】:

在 Flutter 中,我使用 StreamBuilder 从 Firestore 的集合中获取文档的子集合。但是我得到了 null 并且进度指示器一直在旋转。

结构如下:

/dev/l0WwBF4HXBZ59hMGcKvY/meas_weight

这是控制台视图:

这是我的代码:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: Firestore.instance
            .collection('dev')
            .document('l0WwBF4HXBZ59hMGcKvY')
            .collection('meas_weight')
            .snapshots(),
        builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
          if (snapshot.hasError) return new Text('Error: ${snapshot.error}');
          switch (snapshot.connectionState) {
            case ConnectionState.waiting:
              return CircularProgressIndicator();
            default:
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot document = snapshot.data.documents[index];
                  return ListTile(
                    title: Text('${document['value']}'),
                  );
                },
              );
          }
        },
      ),
    );
  }

如果我只是查询父集合“dev”,它可以正常工作,并且我会得到其中的文档列表。但如果我尝试获取“meas_weight”子集合,则不会。

感谢您的帮助。

【问题讨论】:

  • 根据:firebase.google.com/docs/firestore/query-data/…“使用移动/Web 客户端库无法检索集合列表。您应该只在受信任的服务器环境中将集合名称作为管理任务的一部分进行查找。如果您发现您在移动/网络客户端库中需要此功能,请考虑重组您的数据,以便子集合名称是可预测的。”
  • 谢谢马里奥。我希望找到一个解决方案,而不必重组数据。但我想我已经达到了极限。

标签: flutter google-cloud-firestore stream-builder


【解决方案1】:

问题原来与规则有关。我没有意识到这些规则不适用于子集合,除非它们被明确设置。这就是为什么我没有费心将它们包括在我的问题中的原因。在此处查看文档:

https://firebase.google.com/docs/firestore/security/rules-structure#hierarchical_data

所以我首先将集合重命名为“meas_weights”,然后像这样更改规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /dev/{user} {
      allow read,write: if request.auth != null;
      match /meas_weights/{meas_weight} {
        allow read, write: if request.auth != null;
      }
    }
  }
}

然后我就可以得到子集合中的文档了。

【讨论】:

    猜你喜欢
    • 2021-04-08
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2020-10-10
    • 2018-06-19
    • 2021-07-12
    • 2020-05-08
    相关资源
    最近更新 更多