【问题标题】:Flutter chat app, paginate the message streamFlutter 聊天应用,对消息流进行分页
【发布时间】:2020-08-16 11:28:07
【问题描述】:

我的应用中有一个简单的聊天功能,只有文字。现在我正在使用一个 StreamProvider,它利用了 Provider 包。像这样:

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 来显示聊天。我想知道的是,如果像这样提取所有消息是提高效率的正确方法。如果没有,我如何添加分页,以便用户向上滚动时加载其他过去的消息。

【问题讨论】:

    标签: flutter


    【解决方案1】:

    是的,从长远来看,拉取所有这样的消息会花费你很多。你需要研究分页。

    借助 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?

    一旦你理解了两者,你就可以想出分页解决方案。

    【讨论】:

      猜你喜欢
      • 2021-08-19
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多