我正在尝试从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;
}
这似乎应该很简单,我想念什么?
答案 0 :(得分:0)
如果将await
与then
(和forEach
)混合使用,则很难发现问题。完全使用await
或then
,最好不要混合使用(最好避免使用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,
);
}));
}