Flutter - 如何构建实现消息已读或未读功能的聊天应用程序?

4

我试图制作一个具有已读或未读消息功能的聊天应用程序。但我真的不知道如何实现它。

enter image description here

我目前使用Firestore作为存储消息的数据库。

我使用StreamBuilder来流式传输消息,并在每次将消息添加到聊天室时重建UI界面。

请问有哪些小部件可以推荐给我,或者有任何关于如何实现这一功能的想法吗?


4
假设有两个人(Alice和Bob),Alice发送了一条消息(firestore文档)。当Bob读取该消息(firestore文档)时,会更新一个值。这个值可以是一个布尔值isRead表示是否已读。 - Abdelbaki Boukerche
谢谢回复。当Alice发送一条消息(isRead为false),当Bob阅读时(你所说的阅读是指重建聊天UI吗?)isRead变为True。如果Bob的应用程序在后台运行会发生什么?StreamBuilder是否会重建聊天UI?如果不是,那可能会起作用。 - Purinut
1
通过更改 isRead,我是指当 Bob 进入聊天时,消息将加载,然后他将获取最后一个文档并更改 isRead = true。每次他进入聊天或接收到新消息时,他都会这样做。StreamBuilder 是否在后台重建聊天 UI? 我找不到任何好的文档,但我认为只有在应用程序在前台时 UI 才会更新!!您可以发布另一个关于此主题的问题。 - Abdelbaki Boukerche
无论如何,感谢您的想法,我会尝试实现它。 - Purinut
1
你好, 将近一年过去了,你找到解决方案了吗?我也在寻找类似的东西,如果有一个起点就太好了。 - Emilio Dalla Torre
2
嗨,我想知道什么会触发Flutter将isRead更新为true?如果我们只在用户推到屏幕时触发该函数,那么如果用户已经在屏幕上当新消息发送时,这是否意味着更新isRead为true的函数不会被触发? - scott lee
1个回答

1
在这里,您可以为用户的对话创建一个Firestore集合。要发送消息,请将消息存储为对话集合的文档,同时包括时间戳和一个isRead布尔标志。还要添加一个sender值,因为这是我们知道消息是否来自用户的地方。
Collection 
-- conversation_userA_userB
   -- Document
      -- message: "Hello"
         sender: userA
         timestamp: {UNIX_TIME}
         isRead: true
      -- message: "Hi"
         sender: userB
         timestamp: {UNIX_TIME}
         isRead: false

一旦用户查看了消息,如果该消息来自另一个用户,则更新消息的isRead标志。应用程序可以使用Stream监听集合,以便UI可以实时更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接