Flutter聊天应用程序,对消息流进行分页

时间:2020-05-01 22:07:40

标签: flutter

我的应用程序中有一个简单的聊天功能,只有文本。现在,我正在使用通过提供程序包的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来显示聊天记录时,一切都很好。我想知道的是,是否像这样拉出所有消息是提高效率的正确方法。如果没有,我该如何添加分页,以便用户向上滚动时可以加载其他过去的消息。

1 个答案:

答案 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?

一旦您对两者都了解,便可以提出分页解决方案。