flutter 如何确保在检查列表包含的内容之前填充列表?

pes8fvy9  于 2023-01-14  发布在  Flutter
关注(0)|答案(1)|浏览(122)

在下面的代码片段中,我如何确保在检查列表包含的内容之前填充senderID列表?我从firestore提取数据,将其存储在列表中,然后检查它是否包含特定的键。

Stream<List<Group>> getChatGroups(String grpId) {
        return firestore.collection('groups').snapshots().map((event) {
          List<Group> groups = [];
          List<String> senderIds = [];
    
          for (var document in event.docs) {
            var group = Group.fromMap(document.data());
    
            firestore.collection('groups').doc(group.groupId).collection('chats').get().then((QuerySnapshot snapshot) {
              snapshot.docs.forEach((DocumentSnapshot doc) {
                var messageData = doc.data() as Map<String, dynamic>;
                var messages = Message.fromMap(messageData);
                var grId = doc.reference.parent.parent?.id;
    
    //The values in SenderIds should be set before the function below is initiaited 
                senderIds.add(messages.senderId);
    
              });
              
            });
    
    
    //This if function should initiate after getting set above
            if (senderIds.contains(auth.currentUser!.uid)) {
              groups.add(group);
            }
          }
          return groups;
        });
      }
62lalag4

62lalag41#

如果你想让senderIds.contains只在所有的Future完成后被调用,那么构建一个FutureList,然后在这个List上使用Future.wait

var futures = <Future<void>>[];
for (var document in event.docs) {
  // ...

  futures.add(
      firestore
        .collection('groups')
        .doc(group.groupId)
        .collection('chats')
        .get()
        .then((QuerySnapshot snapshot) {
           // ...
        }),
  );
}

await Future.wait(futures);
if (senderIds.contains(auth.currentUser!.uid)) {
  // ...
}

注意,由于上面的代码是异步的,因此还应该使用asyncMap而不是map

相关问题