HarmonyOS实战:腾讯IM之聊天详情页面搭建(二)

article/2025/8/2 21:14:32

前言

鸿蒙版本腾讯 IM 的聊天功能十分复杂,需要开发者手动实现整个聊天对话的业务代码,这对开发者来说是个不小的挑战。本篇文章先从最基础的聊天对话列表开始教你一步一步实现完整的聊天功能,建议点赞收藏!

实现效果

先看本文最终的基本实现效果。

需求分析

  • 对话列表左右排列
  • 支持发送文本消息
  • 支持实时接收消息
  • 支持拉取历史消息

技术实现

获取历史消息

  1. 当从会话列表进入聊天详情页面时,首先拉取最新历史消息。可以通过设置参数指定获取最近时长的历史消息,这里默认设置拉取最近一天的数据。
  let option: V2TIMMessageListGetOptio option = {getType: V2TIMMessageGetType.V2TIM_GET_CLOUD_OLDER_MSG,userID: this.userId,count: 15,getTimeBegin: this.messageData!=undefined&&this.messageData.totalCount()>0 ? this.messageData.getDataAll()[0].timestamp:new Date().getTime(),getTimePeriod: 60 * 60 * 24000};V2TIMManager.getMessageManager().getHistoryMessageList(option).then((messageList: V2TIMMessage[]) => {})

展示聊天列表

  1. 得到历史消息数据后,需要将数据绘制到页面上,同时注意对方和自己消息布局的排列。这里是使用 List 作为展示控件,同时使用鸿蒙原生的懒加载 LazyForEach 进行布局。
 List({ scroller: this.scroller }) {LazyForEach(this.messageData, (item: V2TIMMessage, index: number) => {ListItem() {this.ItemLayout(item)}}, (item: V2TIMMessage, index: number) => item.timestamp + "")}

注意 LazyForEach 的 键值使用的是消息体的时间戳。

  1. 接着绘制 item 的布局页面,先绘制对方的 UI 布局,通过消息体提供的 isSelf 字段判断当前消息是不是自己发的,以此将对话布局显示在左侧。
 Row{Flex({ justifyContent: this.message.isSelf ? FlexAlign.End : FlexAlign.Start, direction: FlexDirection.Row }){if (!this.message.isSelf) {Image(this.message?.faceURL).alt($r("app.media.head_default")).flexShrink(0)}Text(this.getMessageForType(this.message))}

更新实时消息

当对方发送新的消息时,需要及时更新到消息列表中显示,要实现实时消息的更新需要增加消息监听回调。
 

/*** 实时消息监听*/advancedMsgListener: V2TIMAdvancedMsgListener = {onRecvNewMessage: (message: V2TIMMessage) => {if (message!=undefined&&message.userID == this.userId) {this.messageData.pushData(message)this.scroller.scrollEdge(Edge.Bottom)IMListViewModel.cleanConversationUnreadMessageCount(message.userID)}},onRecvMessageRevoked: (msgID: string, operateUser: V2TIMUserFullInfo, reason: string) => {let result = this.messageData.getDataAll().filter((item) => {return msgID == item.msgID})if (result.length > 0) {let index = this.messageData.getDataAll().indexOf(result[0])this.messageData.deleteData(index)result[0].status = V2TIMMessageStatus.V2TIM_MSG_STATUS_LOCAL_REVOKEDthis.messageData.addData(index, result[0])}}}MessageTestInterfaces.addAdvancedMsgListener(this.advancedMsgListener)

发送文本消息

实现完消息的展示之后,需要实现文本消息的发送,调用 IM SDK 提供的sendC2CTextMessage方法创建本地文本消息,然后发送即可。

 let sendMessage = V2TIMManager.getMessageManager().createTextMessage(text)if (sendMessage == null || sendMessage.status == V2TIMMessageStatus.V2TIM_MSG_STATUS_SENDING) {return}sendMessage.isSelf = truesendMessage.elemType = V2TIMElemType.V2TIM_ELEM_TYPE_TEXTsendMessage.timestamp = new Date().getTime()sendMessage.nickName = //用户名称sendMessage.faceURL =  //用户头像sendMessage.status = V2TIMMessageStatus.V2TIM_MSG_STATUS_SENDINGlet textContent = new V2TIMTextElem()textContent.text = textsendMessage.textElem = textContentthis.inputContent = ""const result = V2TIMManager.getInstance().sendC2CTextMessage(text, this.userId);

总结

本篇文章通过实际案例讲叙搭建一个聊天详情的基本实现思路。主要涉及历史消息的获取,实时消息的刷新,和文本消息的发送。接下来需要增加消息撤回,消息删除,发送失败等消息状态的实现。已经学会了的小伙伴,赶快动手试试吧!


http://www.hkcw.cn/article/DritXbMAlm.shtml

相关文章

IM系统的负载均衡

1.IM场景的负载均衡 2.方案总览 SDK层想要连接一个TCP网关或者WebSocket网关的方案 SDK单地址:在SDK中写死某个网关的IP或者域名,缺点是更换地址需要重新打包SDK SDK多地址:防止某一个地址嗝屁了写上多个地址用足保持高可用 暴露接口给客户端:SDK层访问接口动态获得地址 注…

动态规划之网格图模型(一)

文章目录 动态规划之网格图模型(一)LeetCode 64. 最小路径和思路Golang 代码 LeetCode 62. 不同路径思路Golang 代码 LeetCode 63. 不同路径 II思路Golang 代码 LeetCode 120. 三角形最小路径和思路Golang 代码 LeetCode 3393. 统计异或值为给定值的路径…

血糖监测仪解决方案推荐芯片-NRF52832/HS6621/OM6626

随着糖尿病患者数量的增加和人们健康意识的提升,血糖监测仪成为了日常健康管理的重要设备。市场对便携、智能且易于使用的血糖监测仪需求持续增长,而无线通信技术,尤其是蓝牙技术,已成为现代血糖监测仪的核心组件,提供…

基于Vite的前端自动化部署方案

👨 作者简介:大家好,我是Taro,全栈领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、主流解决方案二、了解SCP概念三、自动化部署…

PlankAssembly 笔记 DeepWiki 正交视图三维重建

manycore-research/PlankAssembly | DeepWiki PlankAssembly项目原理 这个项目是一个基于深度学习的3D重建系统,其核心原理是从三个正交视图的工程图纸中重建出3D形状的结构化程序表示。 核心技术原理 1. 问题定义 PlankAssembly旨在从三个正交视图的工程图纸中…

MQTT协议,EMQX部署,MQTTX安装学习

一、MQTT概述 1.什么是MQTT MQTT是一种基于“发布订阅“”模式的消息传输协议。 消息:设备和设备之间传输的数据,或者服务和服务之间要传输的数据。 协议:传输数据时所遵循的规范。 2.常见的通讯模式 (1)客户端-服…

多模态大语言模型arxiv论文略读(101)

ML-Mamba: Efficient Multi-Modal Large Language Model Utilizing Mamba-2 ➡️ 论文标题:ML-Mamba: Efficient Multi-Modal Large Language Model Utilizing Mamba-2 ➡️ 论文作者:Wenjun Huang, Jiakai Pan, Jiahao Tang, Yanyu Ding, Yifei Xing, …

论文阅读:ADVWEB : CONTROLLABLE BLACK-BOX ATTACKS ON VLM-POWERED WEB AGENTS

原文:2410.17401 源码:https://ai-secure.github.io/AdvWeb/ 摘要: 本文设计了一种专门针对web agent的黑盒攻击框架,通过训练一个对抗性提示生成模型,在网页中自动生成并注入“隐形”对抗性字符串,引导网…

Wireshark 在 macOS 上使用及问题解决

wireshark概述 Wireshark 是被广泛使用的免费开源网络协议分析软件(network protocol analyzer)或网络数据包分析工具,它可以让你在微观层面上查看网络上发生的事情。它的主要功能是截取网络数据包,并尽可能详细地展示网络数据包…

企业级安全实践:SSL/TLS 加密与权限管理(一)

引言 ** 在数字化转型的浪潮中,企业对网络的依赖程度与日俱增,从日常办公到核心业务的开展,都离不开网络的支持。与此同时,网络安全问题也日益严峻,成为企业发展过程中不可忽视的重要挑战。 一旦企业遭遇网络安全事…

#Js篇:BlobFile对象URL.createObjectURL()fetchlocationnavigatornew URl

Blob 在 JavaScript 中,Blob 是一个非常重要的对象,用于表示不可变的、原始的二进制数据块(Binary Large Object) arrayBuffer():获取 Blob 的二进制数据作为 ArrayBuffer。 stream():创建一个可读流&…

HAProxy 可观测性最佳实践

HAProxy 简介 HAProxy(High Availability Proxy)是一款广泛使用的高性能负载均衡器,支持 TCP 和 HTTP 协议,提供高可用性、负载均衡和代理服务。它特别适用于负载较大的 Web 站点,能够支持数以万计的并发连接&#xf…

软件测试|FIT故障注入测试工具——ISO 26262合规下的智能汽车安全验证引擎

FIT(Fault Injection Tester)是SURESOFT专为汽车电子与工业控制设计的自动化故障注入测试工具​,基于ISO 26262等国际安全标准开发,旨在解决传统测试中效率低、成本高、安全隐患难以复现的问题,其核心功能包括&#xf…

【计算机网络】应用层协议Http——构建Http服务服务器

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹: 【Linux笔记】——进程间关系与守护进程 🔖流水不争,争的是滔滔不息 一、Http协…

[ctfshow web入门] web80

信息收集 过滤了php和data if(isset($_GET[file])){$file $_GET[file];$file str_replace("php", "???", $file);$file str_replace("data", "???", $file);include($file); }else{highlight_file(__FILE__); }解题 大小写…

移动安全Android——客户端数据安全

本地文件权限配置 测试流程 (1)手机运行待测APP应用,adb执行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY (2)adb shell 进入设备,以Root权限进入/data/data/package包名目录下 c…

AI生态警报:MCP协议风险与应对指南(下)——MCP Host安全

AI生态警报:MCP协议风险与应对指南(上)——架构与供应链风险https://blog.csdn.net/WangsuSecurity/article/details/148335401?sharetypeblogdetail&sharerId148335401&sharereferPC&sharesourceWangsuSecurity&spm1011.24…

机房网络设备操作安全管理制度

该制度围绕机房网络设备操作安全,规定账号实行系统管理员、操作管理员、一般用户三级分级管理,遵循最小授权和权限分割原则,账号需实名制、禁止共享及转借,密码设置需至少 8 位、3 种字符组合且每 3 个月修改一次;高危指令执行需上级审批、双人核查,远程登录需限制权限、…

Root权限:解锁Android的终极力量

Root后的功能扩展 Root后可以实现的高级功能,如系统级备份、自定义ROM、性能优化、广告屏蔽等。 Root的风险与防范 讨论Root可能导致的安全问题,如恶意软件攻击、系统不稳定、保修失效等,提出降低风险的建议,如使用可信工具、备…

亚马逊数据采集软件完全指南:从工具原理到实战落地

亚马逊数据采集软件有哪些?在数字化商业浪潮中,亚马逊作为全球电商巨头,其平台上蕴含着海量的数据宝藏。对于卖家、品牌商以及市场分析师而言,精准获取和分析这些数据,成为了在激烈竞争中脱颖而出的关键。从产品定价的…