'DateTime'类型不是'List <dynamic>'类型的子类型Flutter和firebase

时间:2020-01-13 16:25:44

标签: firebase flutter

所以我有一个功能可以从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(lastDoc.data ['timestamp']。toDate()。add(Duration(hours:1)));

但是由于某些原因,当我尝试使用

加载更多消息时

startAfter( lastDoc.data ['timestamp']。toDate()。add(Duration(hours:1)))

屏幕显示红色,并显示以下错误消息:类型“ DateTime”不是“列表”类型的子类型

我尝试使用 lastDoc.data ['timestamp'] lastDoc.data ['timestamp']。toDate() lastDoc .data ['timestamp']。toDate()。add(Duration(hours:hours)),但什么也没发生,并且发生了同样的错误。

注意 ,我正在将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 个答案:

答案 0 :(得分:1)

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上的精彩视频,说明了分页:

How Do I Paginate My Data?

此页面是Firestore文档的不错资源:

Paginating data with query cursors