тип 'DateTime' не является подтипом типа 'List <dynamic>' Flutter and firebase - PullRequest
0 голосов
/ 13 января 2020

так что у меня есть функция, которая получает данные из firebase firestore для моего чата, я хотел добавить к нему нумерацию страниц.

я создал эту функцию:

getMessage() {
if (!hasMore) {
  return;
}
if (isLoading) {
  return;
}
if (lastDoc == null) {
  _querySnapshot = widget.messageDocRef
      .collection('Chat')
      .orderBy('timestamp', descending: true)
      .limit(15)
      .getDocuments();
} else if (lastDoc != null) {
  _querySnapshot = widget.messageDocRef
      .collection('Chat')
      .orderBy('timestamp', descending: true)
      .startAfter(
          lastDoc.data['timestamp'].toDate().add(Duration(hours: 1)))
      .limit(15)
      .getDocuments();
}
_querySnapshot.then((docSnap) {
  lastDoc = docSnap.documents[docSnap.documents.length - 1];
  print(lastDoc);
  print(lastDoc.data['content']);
  print(lastDoc.data['timestamp'].toDate().add(Duration(hours: 1)));
});
return _querySnapshot.asStream();

}

в этой строке выведите правильное время, сохраненное в firestore.

print ( lastDo c .data ['timestamp']. toDate (). add (Duration (hours: 1)));

, но по какой-то причине, когда я пытаюсь загрузить больше сообщений с

startAfter (lastDo c .data ['timestamp']. ToDate (). Add (Duration (hours: 1)))

экраны становятся красными с этим сообщение об ошибке: тип 'DateTime' не является подтипом типа 'Список'

Я пробовал с lastDo c .data ['timestamp'] & с lastDo c .data ['timestamp']. toDate () и с lastDo c .data ['timestamp']. toDate (). add (Продолжительность (часы: 1)) , но ничего не произошло, и возникает та же ошибка.

NOTE , что я назначаю getMessage () для streamBuilder.

это мой StreamBuilder

StreamBuilder(
  //TODO add pagination later...
  stream: getMessages(),
  /*stream: widget.messageDocRef
      .collection('Chat')
      .orderBy('timestamp', descending: true)
      .limit(80)
      .getDocuments()
      .asStream(),*/
  builder: (BuildContext context, AsyncSnapshot snapshot) {
    if (!snapshot.hasData) {
      return Center(
        child: circularProgress(),
      );
    }
    final messages = snapshot.data.documents;

    List<MessageBubble> messagesBubble = [];
    for (var message in messages) {
      final messageText = message.data['content'];

      final messageSender = message.data['from'];

      final messageType = message.data['type'];

      final messageBubble = MessageBubble(
        type: messageType,
        text: messageText,
        isMe: widget.currentUser.id == messageSender,
      );
      messagesBubble.add(messageBubble);
    }
    return Expanded(
      child: ListView(
        physics: const AlwaysScrollableScrollPhysics(),
        reverse: true,
        controller: _scrollController,
        padding: EdgeInsets.symmetric(vertical: 20.0, horizontal: 10.0),
        children: messagesBubble,
      ),
    );
  },
);

спасибо!

1 Ответ

1 голос
/ 13 января 2020

startAfter принимает List типа dynamic в качестве входных данных, поэтому оберните lastDoc.data['timestamp'].toDate().add(Duration(hours: 1)) в список [].

Также, поскольку у вас есть список документов, пригодный для этой функции, вы можете используйте: startAfterDocument такое в:

 _querySnapshot = widget.messageDocRef
      .collection('Chat')
      .orderBy('timestamp', descending: true)
      .startAfterDocument(lastDoc)

Надеюсь, это поможет.

Вот хорошее видео от команды Firebase на YouTube, объясняющее разбиение на страницы:

Как разбить мои данные на страницы?

И эта страница является хорошим ресурсом из документации Firestore:

Разбиение данных на страницы с помощью курсоров запросов

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