Flutter显示集合与Firestore中的子集合

时间:2020-06-17 12:13:33

标签: firebase flutter google-cloud-firestore

我正在使用Flutter应用程序,该应用程序显示其中包含项目的类别列表。数据是从firebase提取的。

数据库结构:

Categories

Category items

我想显示这样的数据,并且必须是实时的:

  • 类别1
    • 项目1
    • 第2项
    • 第3项
  • 类别2
    • 类别2中的项目 ..

我尝试使用Streambuilder,但这只能获取类别。 有人可以帮助我,也可以向我指出正确的方向,以获取项目列表作为每个类别的快照吗?预先感谢

快照仅包含字段,不包含集合。那么,我是否需要另一个带有每个类别的documentID的Streambuilder?这似乎是很多工作,需要读取大量数据库,只是为了获取已经获取的项目的集合。

StreamBuilder(
    stream: _db.collection('categories').document(widget.id).collection('categories').orderBy('tag', descending: true).snapshots(),
    builder: (context, snapshot) {
      if(!snapshot.hasData) {
        return Loader();
      } else {
        List<dynamic> docs = snapshot.data.documents;
        docs.forEach((element) {
          print(element['title']);
          print(element.collection('items')); // Does not exist
        });
        return Text('test');
      }
    },

1 个答案:

答案 0 :(得分:1)

Firestore一次只能加载一个集合(或集合组)中的数据。由于您要尝试从categoriesitems集合中加载数据,因此至少需要两个单独的读取操作。

  StreamBuilder(
    stream: _db.collection('categories').document(widget.id).collection('categories').orderBy('tag', descending: true).snapshots(),
    builder: (context, snapshot) {
      if(!snapshot.hasData) {
        return Loader();
      } else {
        List<dynamic> docs = snapshot.data.documents;
        docs.forEach((element) {
          print(element['title']);
          element.reference.collection('items').get()...
        });
        return Text('test');
      }
    },

由于这是另一种异步加载操作,因此您需要将get()调用包装在FutureBuilder中。