Firestore 聊天应用程序 - 构建消息主页

Posted

技术标签:

【中文标题】Firestore 聊天应用程序 - 构建消息主页【英文标题】:Firestore chat app - build messages home page 【发布时间】:2019-12-20 14:05:45 【问题描述】:

我有一个带有 Firestore RTDB 后端的 Flutter 聊天应用:

messages (collection)
    message_1 (document)
        chat (collection)
            chat_1 (document)
            chat_2 (document)
        users (array, document field)
            user_id_1 (String)
            user_id_2 (String)
        user_info (map to store user info, like name, avatar etc)
    message_2 (document)
        chat (collection)
            chat_1 (document)
            chat_2 (document)
        users (array, document field)
            user_id_1 (String)
            user_id_2 (String)
        user_info (map to store user info, like name, avatar etc)

我想创建一个主页,其中显示用户参与的所有聊天,按最近排序,就像任何普通聊天应用一样:

我知道如何显示用户参与的聊天。问题是,我不知道如何处理排序。有一种简单的方法可以做到这一点:每次发送新消息时,使用云功能并更新消息文档中名为lastSent 的字段,然后在查询中执行orderBy('lastSent', descending: true)。问题是,每次发送消息时,都必须进行两次写入,而不是仅仅为了更新该字段。有没有更好的方法来处理这个?

注意:我的应用不仅仅是一个聊天应用,它只是主应用的一部分。想象一下类似于 Airbnb 的聊天功能,因此聊天消息的数量或频率可能不如 Facebook Messenger 大

【问题讨论】:

你有这个实现吗,如果有,请分享一下,因为我也处于同样的情况 是的。你到底需要什么?更新最新字段的云功能? 我想显示一个最近聊天列表,列表根据最新聊天排序,我还想在该列表中显示最后一条消息和时间戳。我正在使用flutter和firestore,目前我能够显示最近聊天的列表,但只有用户名和列表按字母顺序排序 我已发送邮件 你能分享你的代码吗?我需要完全相同的东西。 【参考方案1】:

常见的解决方案是按照您的建议:在每个“聊天室”的文档中存储一个latest_updated 时间戳。

这确实意味着您需要进行两次写入而不是一次。但另一方面,您现在只需阅读“聊天室”文档即可确定正确的排序方式,而不是阅读其中的个别消息。

请注意,虽然当然可以使用 Cloud Functions 执行此操作,但也可以直接从客户端执行此操作。您甚至可以在安全规则中捕获客户端只能写入新消息的要求,如果他们还将相应“聊天室”文档的 latest_updated 时间戳设置为与消息的时间戳相同的值,尽管这会您添加的每条消息都会产生额外阅读一份文档的费用。

【讨论】:

我想你的意思是说“每条消息有一个额外的文档write”而不是read。 :) 除非您假设在加载聊天列表时正在阅读带有 latest_updated 时间戳的消息,否则它将是一次额外的读取和一次额外的写入。 这是一个读取,因为安全规则必须 get() 该聊天室文档检查其 last_updated 字段。 啊,我以为您指的是除了写入消息之外还更新latest_updated 字段的附加写入。我的错。 不用担心。在我想起我为什么发表评论之前,我不得不仔细考虑它。

以上是关于Firestore 聊天应用程序 - 构建消息主页的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 聊天应用程序:这是多收件人消息的有效文档结构吗?

Flutter StreamBuilder 与 Firestore 分页

当聊天线程有未读消息时如何显示徽章React JS,Firestore

如何在滚动到顶部同时添加侦听器时对从 Firestore 获取的聊天进行分页

Firestore Streams 订阅

设置 Firestore 文档时如何检测不存在的网络连接