Flutter / Firestore - Streambuilder и Firestore со слушателем в реальном времени - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь настроить поток Firestore внутри построителя потока, как показано в их документе, но когда я обновляю или удаляю документ, он не отражается на экране.Журналы обновляются, но не отображаются на экране.

Код:

// Chats API file
Stream<List<Message>> messagesStream({String chatID, String orderBy, bool descending, List<dynamic> startAfter, int limit}) {
  return this
      .collection
      .document(chatID)
      .collection(Config.messages)
      .orderBy(orderBy, descending: descending)
      .startAfter(startAfter)
      .limit(limit)
      .snapshots()
      .map((event) => event.documents.map((documentSnapshot) => Message().model(id: documentSnapshot.documentID, map: documentSnapshot.data)).toList().reversed.toList());
}


// Chat file
Widget _streamBuilderWidget;

@override
void initState() {
  super.initState();

  this._streamBuilder();
  if (Platform.isIOS) {
    this._scrollController.addListener(() {
      if (this._scrollController.position.pixels <= -135.0) {
        this._checkForOldMessages();
      }
    });
  }
}

@override
Widget build(BuildContext context) {
    …
    Expanded(child: this._streamBuilderWidget),
    …
}

Widget _streamBuilder() {
  return this._streamBuilderWidget = StreamBuilder<List<Message>>(
      initialData: this._messages,
      stream: APIs().chats.messagesStream(chatID: widget.chat.chatID, orderBy: 'createdAt', descending: true, startAfter: this._startAfter, limit: this._messagesLimit),
      builder: (context, snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting:
            {
              return PAIndicator();
            }
          default:
            {
              if (snapshot.data.length < this._messagesLimit) {
                this._hasMoreMessages = false;
              } else {
                this._hasMoreMessages = true;
              }

              snapshot.data.forEach((m) {
                print(m.message); // Prints 10 values even when 1 file is changed
              });

              this._messages.insertAll(0, snapshot.data);

              return Platform.isIOS
                  ? MessagesList(mKey: this._listKey, scrollController: this._scrollController, messages: this._messages, aUser: widget.aUser)
                  : RefreshIndicator(
                      child: MessagesList(mKey: this._listKey, scrollController: this._scrollController, messages: this._messages, aUser: widget.aUser),
                      onRefresh: () async {
                        await Future.delayed(Duration(seconds: 1));

                        this._checkForOldMessages();

                        return null;
                      });
            }
        }
      });
}

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

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

Примечание: у меня это так, потому что по какой-то причине, когда я набираю текст, он перезагружается и когда я прокручиваюмассив просто умножает себя, а что нет.Это единственный способ добавить старые сообщения в массив при прокрутке, о которых я знаю.

Новые сообщения не отображаются, пока я снова не войду в чат.

1 Ответ

0 голосов
/ 13 июня 2019

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

https://firebase.google.com/docs/firestore/query-data/query-cursors

...