Flutter Fierstore如何从聊天对话中获取最新消息?

时间:2018-10-18 10:15:24

标签: firebase flutter google-cloud-firestore

我正在将Flutter与Cloud Firestore一起使用来构建聊天应用程序,我希望用户列表中包含最新消息

enter image description here

enter image description here

我在Google上搜索了一下,找到了如何在两个集合之间建立链接并创建另一个列表

 await Firestore.instance
            .collection('users')
            .getDocuments()
            .then((results) {
          List<Users> users = [];
          results.documents.forEach((doc) {
            Users user = new Users();

            String id = doc.data['id'];
            if (id.hashCode <= currentUserId.hashCode) {
              groupChatId = '$id-$currentUserId';
            } else {
              groupChatId = '$currentUserId-$id';
            }

            user.Id = doc.data['id'];
            user.Name = doc.data['name'];

            Firestore.instance
                .collection('messages')
                .document(groupChatId)
                .collection(groupChatId)
                .getDocuments()
                .then((m) {
              if (m.documents.length > 0) {
                user.LastMessage = m.documents.first.data['content'];
              }
            });

            print(user.LastMessage);

            users.add(user);
          });
          setState(() {
            _users = users;
          });
        });

当我打印user.LastMessage返回null,但_users包含所有信息,但_users列表中有消息。

1 个答案:

答案 0 :(得分:2)

怀疑,我没有测试:

在第二个then处理程序中,您正在获取最后一条消息,但是到它到达时,该块已完成执行,而您不必等待它返回。

也许尝试这样:

void _fetch() async {
  // Wait for all documents to arrive, first.
  final result = await Firestore.instance
              .collection('users')
              .getDocuments();

  List<Users> users = [];

  results.documents.forEach((doc) {
    Users user = new Users();

    String id = doc.data['id'];
    if (id.hashCode <= currentUserId.hashCode) {
      groupChatId = '$id-$currentUserId';
    } else {
      groupChatId = '$currentUserId-$id';
    }

    user.Id = doc.data['id'];
    user.Name = doc.data['name'];

    // Wait for each single message to arrive
    final m = await Firestore.instance
        .collection('messages')
        .document(groupChatId)
        .collection(groupChatId)
        .getDocuments();

    if (m.documents.length > 0) {
      user.LastMessage = m.documents.first.data['content'];
    }

    print(user.LastMessage);

    users.add(user);
  });

  setState(() {
    _users = users;
  });
}

但是,请注意,如果您有很多对话,则这种方法效率不高。

您可以考虑使用Future.wait(您需要将onEach替换为返回期货的map)。