所以我有一个功能可以从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,
),
);
},
);
谢谢!
答案 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上的精彩视频,说明了分页:
此页面是Firestore文档的不错资源: