Flutter Fierstore, как получить последнее сообщение из чата? - PullRequest
0 голосов
/ 18 октября 2018

Я использую Flutter с Cloud Firestore для создания приложения чата, мне нужен список пользователей с последними сообщениями

enter image description here

enter image description here

Я погуглил и нашел, как объединить две коллекции и создать другой список

 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 возвращает ноль, но _users содержат всю информацию, но есть сообщениевнутри списка _users.

1 Ответ

0 голосов
/ 18 октября 2018

Подозрение, я не проверял это:

Внутри второго обработчика 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, который возвращает фьючерсы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...