我的应用程序中有一个简单的聊天功能,只有文本。现在,我正在使用通过提供程序包的StreamProvider。像这样:
return MultiProvider(
providers: [
FutureProvider.value(
value: DatabaseProvider().getDMProfile(pairing.dmId)),
FutureProvider.value(
value: DatabaseProvider().getPlayerProfile(pairing.playerId)),
StreamProvider.value(value: ChatProvider().streamMessages(chatName)),
],
child: ChatScreen(
hidden: isPlayer ? pairing.playerHidden : pairing.dmHidden,
isPlayer: isPlayer,
chatName: chatName,
),
);
在此显示流的代码:
Stream<List<Message>> streamMessages(String chatId) {
var ref = db
.collection(CHAT_COLLECTION)
.document(chatId)
.collection(MESSAGES_COLLECTION)
.orderBy('timestamp', descending: true);
return ref.snapshots().map((list) =>
list.documents.map((doc) => Message.fromMap(doc.data)).toList());
}
当我创建一个ListView来显示聊天记录时,一切都很好。我想知道的是,是否像这样拉出所有消息是提高效率的正确方法。如果没有,我该如何添加分页,以便用户向上滚动时可以加载其他过去的消息。
答案 0 :(得分:0)
是的,从长远来看,像这样拉出所有消息可能会花费很多。您需要研究分页。
使用Cloud Firestore中的查询游标,您可以根据您在查询中定义的参数将查询返回的数据分为几批。
https://firebase.google.com/docs/firestore/query-data/order-limit-data
var ref = db
.collection(CHAT_COLLECTION)
.document(chatId)
.collection(MESSAGES_COLLECTION)
.orderBy('timestamp', descending: true).startAfter(<Date>).limit(<Number of documents you want to fetch>);
一个您了解这种逻辑,您需要检测何时获取其他数据,您可以通过检测用户的滚动来做到这一点。
有关此的更多信息: How to check if scroll position is at top or bottom in ListView?
一旦您对两者都了解,便可以提出分页解决方案。