Как получить доступ к запросу из itemBuilder?

#firebase #flutter #google-cloud-firestore #flutter-animation

#firebase #флаттер #google-облако-firestore #флаттер-анимация

Вопрос:

Я создаю приложение для случайного чата, использующее FirestoreAnimatedList (FirebaseAnimatedList для Firestore).

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

Мое решение — использовать индекс для проверки, отправлено ли последнее сообщение тем же пользователем.

Итак, мне нужна проверка, подобная :

 if (snapshot[index - 1][‘user’] == user) {
  return true;
}
  

Но мой snapshot есть DocumentSnapshot , поэтому не может вызвать [index - 1] .

Может быть, я должен получить список из query ? Как получить доступ, чтобы можно было вызывать index по списку и query вот так?

Спасибо!

Вот пример:

 body: FirestoreAnimatedList(
        query: firestore.collection('messages').snapshots(),
        itemBuilder: (
          BuildContext context,
          DocumentSnapshot snapshot,
          Animation<double> animation,
          int index,
        ) {
          return FadeTransition(
            opacity: animation,
            child: MessageItem(
              index: index,
              document: snapshot,
              onTap: _removeMessage,
            ),
          );
        },
  

Ответ №1:

Вы можете просто хранить пользователей в Map .

В вашем виджете class вам нужно будет создать переменную для хранения карты:

 final Map<int, dynamic> users = {};
  

Затем вы можете заполнить карту в itemBuilder обратном вызове:

 itemBuilder: (
          BuildContext context,
          DocumentSnapshot snapshot,
          Animation<double> animation,
          int index,
        ) {
          users[index] = snapshot['user']; // added line
          return FadeTransition(
            opacity: animation,
            child: MessageItem(
              index: index,
              document: snapshot,
              onTap: _removeMessage,
            ),
          );
        },
  

Теперь вы можете делать то, что хотели:

 if (users[index - 1] == user) {
  return true;
}
  

Комментарии:

1. Спасибо за ответ! Я думал об этом, но неэффективно? Это создаст другую пользовательскую карту из DocumentSnapshot . Но приложение уже извлекает все DocumentSnapshot из query . Так что дублируйте

2. @FlutterFirebase Это очень просто Map . Вы не заметите этого ни в памяти, ни в другой производительности. Вам не следует использовать этот готовый плагин, если вы хотите иметь возможность настройки. Единственное, о чем вам следует беспокоиться при использовании этого Map , это о том, когда его следует очистить, однако я не могу сказать вам, как это сделать, потому что я не знаю, как работает ваше приложение.

3. Спасибо! Так что, нет способа получить исходный список из query ? Может быть, лучше я использую listviewbuilder