繁体   English   中英

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

[英]How do I ensure that the list is populated before checking what it contains?

在下面的代码片段中,如何确保在检查列表包含的内容之前填充 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;
        });
      }

如果您希望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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM