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