【问题标题】:Paginate firestore query while still listening to new documents在仍在收听新文档的同时对 firestore 查询进行分页
【发布时间】:2020-11-02 10:44:48
【问题描述】:

和其他许多人一样,我有一个具有聊天功能的应用程序。我有一个 StreamBuilder<QuerySnapshot> 来收听新的聊天消息,还有一个 ListView.builder 来显示它们。我正在寻找一种对消息进行分页的好方法,但我找到的任何解决方案都不适合我,因为我总是需要收听新消息。

我尝试过的其中一个方法是this code,但即使作者说他已经更新了代码,它似乎也不起作用。

每个聊天消息在集合中都有自己的文档,所以现在我只需获取集合中的所有文档并按时间字段对它们进行排序。但是,这仅适用于大约 20 条消息,然后性能会受到影响,所以如果有人可以帮助我解决这个问题,我会非常高兴。

【问题讨论】:

    标签: flutter google-cloud-firestore pagination


    【解决方案1】:

    我猜你显示的是按创建日期排序的消息,对吧?那你为什么不用日期分页呢?

    chatcollectionref.
    where("creationdate", "<", enddate)
    ... // Add more conditions if needed
    .orderBy("creationdate","desc").limit(20).get()
    

    从遥远的未来enddate 开始,然后将其更新为您检索到的最后一条消息的创建日期,然后进行分页。

    编辑:更多细节...

    1. 第一次运行查询:enddate = new Date(2100, 1, 1),您将获得前 20 条消息并显示它们
    2. 用户向下滚动并到达最后一条消息
    3. 再次运行查询:enddate = 您已检索到的最后一条消息的创建日期,您将获得 20 条下一条
    4. 循环回到 2

    在我的聊天应用中运行良好

    【讨论】:

    • 我可以这样做,但如果用户想向上滚动查看旧消息怎么办?如果我只是将限制添加到 20,除非我指定从哪里开始,例如 .startAfterDocument(),否则您将看不到旧消息,这就是我的问题所在;据我所知,我不能一边听新文件一边这样做
    • 当然可以,这就是为什么在用户滚动时更改结束日期的原因。您仍然只能检索 20 条消息,但您开始晚了
    • 哦,对不起。是的,这可能行得通。马上试试
    • 这行得通,虽然它有点不稳定。但我想我可以通过重叠分页来解决这个问题。我现在的问题是当用户到达终点时我现在怎么做,最好不要显示少于 20 个文档。你知道我是怎么做到的吗?
    • @HannesHultergård 如果此答案有帮助,请考虑投票并将其标记为已接受。如果您对原始问题有更多疑问,请在此处发表评论。否则,如果您有更多与新问题相关的问题,这些问题可能需要创建一个全新的问题。谢谢!
    猜你喜欢
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 2020-09-30
    • 2020-08-25
    • 2019-01-09
    • 2019-09-19
    相关资源
    最近更新 更多