Flutter: сортировка элементов ListView, созданных из StreamBuilder в Firestore - PullRequest
0 голосов
/ 02 мая 2020

Я добавляю в свое приложение простую платформу обмена сообщениями, чтобы пользователи могли общаться. Я использую Firebase Firestore для хранения информации о пользователях и всех чатах (скриншоты структуры ниже). Я уже успешно создал чат, но у меня возникли некоторые проблемы с экраном, на котором отображаются разговоры пользователя, поскольку я смог показать все доступные разговоры, но не могу отсортировать их из последнего последнего сообщения в наименее недавний.

Это упрощенная версия моего кода:

     @override
  Widget build(BuildContext context) {
    return StreamBuilder(
        stream: DatabaseService().getUserStream(uid),
        builder: (context, snapshot) {
          if (!snapshot.hasData)
            return Scaffold(body: CircularProgressIndicator());
          else {
            // gets the user's info from firebase including the ID's of the chats he's in
            // stream used so if anothe user starts a new chat it would show in real time
            user = User.fromSnapshot(snapshot.data);
            return Scaffold(
            body: ListView.builder(
              itemCount: user.chats.length,
              itemBuilder: (BuildContext ctxt, int index) {
                return StreamBuilder(
                  // gets chat data for every chatId contained by the user
                  // stream is used to update in real time last message and its time
                  stream: DatabaseService().getStream(user.chats[index]),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      return Center(child: CircularProgressIndicator());
                    else {
                      Chat chat = Chat.fromSnapshot(snapshot.data);
                      /* ...
                      some processing of chat to extract 'receiver', 'lastMessage' and 'lastMessageDate'
                      ... */
                      return MessageEntry(receiver, lastMessage,
                        lastMessageDate, chat.reference.documentID); // returns a card widget with the user's name,
                            //profile pic, last message in the conversation and time of the message
                    }
                  }
                );
              }
            )
          );
          }
        });
  }

Теперь мне нужно, чтобы записи ListView появились на экране из самого последнего последнего сообщения, проблема в том, что пользовательский объект не содержит эту информацию, поэтому я не могу просто отсортировать список chatId, а затем запустить тот же код.

Мне нужно запускать StreamBuilder вне ListView.build для каждого чата и создать список объектов чата, которые затем можно отсортировать и отобразить в ListView, но я не смог найти никакого способа добиться этого.

Конечно, я открыт для любого другого решения, которое решит проблему.

Вот моя структура Firestore: enter image description here

enter image description here

...