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

Я заставляю приложение случайного чата использовать 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,
            ),
          );
        },
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
125
1

Ответы 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;
}

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

FlutterFirebase 16.03.2019 19:01

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

creativecreatorormaybenot 16.03.2019 19:18

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

FlutterFirebase 16.03.2019 22:24

Другие вопросы по теме