在从Firestore的收集和子收集中检索数据时遇到问题

时间:2019-09-25 14:56:01

标签: flutter google-cloud-firestore

我正在尝试从Firestore查询和检索一组文档和子文档,并将它们存储在我创建的一些自定义对象中。顶部集合映射到“块空间”,子集合是“块”。

我可以毫无问题地检索顶层集合,但是当我尝试遍历子集合文档并将其存储在顶层对象中时,什么也不会返回。

这是执行工作的代码。 1.我从顶级集合中检索“块空间”数据。 2.对于每个文档,然后获取对子级集合(“块”)的引用,创建它并添加到顶级对象 3.返回数据。

     Future<List<Blockspace>> fetchBlockSpaces(String ownerId)  async {

List<Blockspace> blockspacesObjects = List<Blockspace>();

var query = Firestore.instance
    .collection("blockspaces")
    .where('users', arrayContains: ownerId);

   await query.getDocuments().then((blockspaces) {

      blockspaces.documents.forEach((blockspace) async {

         Blockspace b1 = Blockspace(
          blockSpaceId: blockspace.documentID,
          ownerId: blockspace.data['ownerId'],
           icon: blockspace.data['icon'],
          color: blockspace.data['color'],
           name: blockspace.data['name'],
          );

          List<Block> currentBlocks = List<Block>();
          QuerySnapshot blocks = await blockspace.reference.collection('blocks').getDocuments();
          blocks.documents.forEach((block) {
            Block block1 = Block(
            name: block.data['name'],
            color: block.data['color'],
            icon: block.data['icon'],
            // userPermissions: userRoles,
            ownerId: block.data['ownerId']);
            currentBlocks.add(block1);
          });
          b1.blocks = currentBlocks;
          blockspacesObjects.add(b1);
      }); 
   });

    return blockspacesObjects;

}

这似乎应该很简单,我想念什么?

1 个答案:

答案 0 :(得分:0)

如果将awaitthen(和forEach)混合使用,则很难发现问题。完全使用awaitthen,最好不要混合使用(最好避免使用then)。请尝试使用简化的代码:

Future<List<Blockspace>> fetchBlockSpaces(String ownerId) async {
  final query = Firestore.instance
      .collection("blockspaces")
      .where('users', arrayContains: ownerId);

  final snapshot = await query.getDocuments();
  return Future.wait(snapshot.documents.map((bs) async {
    final blocksSnapshot =
        await bs.reference.collection('blocks').getDocuments();
    List<Block> currentBlocks = blocksSnapshot.documents.map((b) {
      return Block(
          name: b.data['name'],
          color: b.data['color'],
          icon: b.data['icon'],
          ownerId: b.data['ownerId']);
    }).toList();
    return Blockspace(
      blockSpaceId: bs.documentID,
      ownerId: bs.data['ownerId'],
      icon: bs.data['icon'],
      color: bs.data['color'],
      name: bs.data['name'],
      blocks: currentBlocks,
    );
  }));
}