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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本文讲解了在鸿蒙系统中实现腾讯IM聊天功能的完整流程,涵盖对话列表展示、历史消息获取、实时消息更新及文本消息发送等核心功能。通过实际代码示例,详细说明了如何利用IM SDK实现聊天业务逻辑。适合开发者逐步学习并实践,建议点赞收藏以便参考。

前言

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

实现效果

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

需求分析

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

技术实现

获取历史消息

  1. 当从会话列表进入聊天详情页面时,首先拉取最新历史消息。可以通过设置参数指定获取最近时长的历史消息,这里默认设置拉取最近一天的数据。
let option: V2TIMMessageListGetOptio 
    option = {
        getType: V2TIMMessageGetType.V2TIM_GET_CLOUD_OLDER_MSG,
        userID: //用户id,
        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)
      }
    },
    onReceviceMessageRevoked: (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_REVOKED
          this.messageData.addData(index, result[0])
        }
    }
  }
MessageTestInterfaces.addAdvancedMsgListener(this.advancedMsgListener)

发送文本消息

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

let sendMessage = V2TIMManager.getMessageManager().createTextMessage(text)
    sendMessage.isSelf = true
    sendMessage.elemType = V2TIMElemType.V2TIM_ELEM_TYPE_TEXT
    sendMessage.timestamp = new Date().getTime()
    sendMessage.nickName = //用户名称
    sendMessage.faceURL =  //用户头像
    sendMessage.status = V2TIMMessageStatus.V2TIM_MSG_STATUS_SENDING
    let textContent = new V2TIMTextElem()
    textContent.text = text
    sendMessage.textElem = textContent
    const result = V2TIMManager.getInstance().sendC2CTextMessage(text, 用户id);

总结

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

目录
相关文章
|
5月前
|
存储 UED 开发者
30.[HarmonyOS NEXT Column案例八(上)] 构建现代聊天界面:层叠布局与消息列表的实现
在HarmonyOS NEXT应用开发中,聊天界面是一种常见且复杂的界面类型,它需要展示消息列表、输入区域以及各种交互元素。本教程将详细讲解如何使用Column组件作为主容器,结合Stack组件实现层叠布局,创建一个现代化的聊天界面。通过ChatPage组件的实际案例,我们将展示如何构建包含消息列表和输入区域的复合布局,帮助开发者掌握复杂布局的实现技巧。
84 5
|
5月前
|
存储 UED 开发者
28.[HarmonyOS NEXT Column案例七(上)] 多层嵌套布局:打造结构清晰的详情页面
在HarmonyOS NEXT应用开发中,详情页是一种常见且重要的界面类型,它需要展示丰富的内容并提供良好的用户体验。本教程将详细讲解如何使用Column组件作为主容器,结合Row、Flex等组件的嵌套使用,创建一个结构清晰、层次分明的详情页面。通过DetailPage组件的实际案例,我们将展示如何构建包含固定区域和弹性区域的复合布局,帮助开发者掌握复杂布局的实现技巧。
103 4
|
5月前
|
前端开发 JavaScript 网络安全
Web网页端即时通讯源码/IM聊天源码RainbowChat-Web
RainbowChat-Web是一套基于MobileIMSDK-Web的网页端IM系统。不同于市面上某些开源练手或淘宝售卖的demo级代码,RainbowChat-Web的产品级代码演化自真正运营过的商业产品,其所依赖的通信层核心SDK已在数年内经过大量客户及其辐射的最终用户的使用和验证。RainbowChat-Web同时也是移动端IM应用RainbowChat的姊妹产品。
146 0
|
5月前
|
容器
49.[HarmonyOS NEXT RelativeContainer案例六] 智能屏障布局:打造自适应聊天气泡界面
在现代移动应用开发中,聊天界面是最常见的交互场景之一。一个优秀的聊天界面需要能够适应不同长度的消息内容,保持布局的一致性和美观性。HarmonyOS NEXT的RelativeContainer组件提供了强大的屏障(Barrier)功能,能够根据内容动态调整布局,非常适合实现聊天气泡这类需要自适应内容边界的UI元素。本教程将详细讲解如何利用RelativeContainer的屏障功能实现一个自适应的聊天气泡界面。
165 70
|
5月前
|
缓存 自然语言处理 监控
基于通义大模型的智能客服系统构建实战:从模型微调到API部署
本文详细解析了基于通义大模型的智能客服系统构建全流程,涵盖数据准备、模型微调、性能优化及API部署等关键环节。通过实战案例与代码演示,展示了如何针对客服场景优化训练数据、高效微调大模型、解决部署中的延迟与并发问题,以及构建完整的API服务与监控体系。文章还探讨了性能优化进阶技术,如模型量化压缩和缓存策略,并提供了安全与合规实践建议。最终总结显示,微调后模型意图识别准确率提升14.3%,QPS从12.3提升至86.7,延迟降低74%。
1475 15
|
5月前
HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
本文详细介绍了鸿蒙 IM 聊天中实现消息撤回、删除和重发功能的方法。消息撤回支持在 120 秒内召回自己发送的消息,通过 `revokeMessage` 方法实现;消息删除使用 `deleteMessage` 方法清除本地与云端记录;消息重发则先删除失败消息再重新发送,并处理用户被拉黑的异常情况。结合状态管理,可轻松实现类似微信的功能,建议点赞收藏并动手实践!
245 3
HarmonyOS实战:腾讯IM之消息删除、撤回和重发(三)
|
4月前
|
人工智能 自然语言处理 监控
生成式AI客服实战:智能客服机器人5大自动化能力处理80%高频咨询,释放60%客服人力
生成式AI驱动的智能客服机器人通过五大核心能力自动化处理80%高频咨询,释放60%客服人力。以合力亿捷方案为例,融合大模型与业务知识图谱,实现服务精准化、决策智能化,推动企业服务成本下降超40%。
389 0
|
5月前
|
程序员 开发者 C++
一文就可搞清楚的HarmonyOS NEXT解锁模态页面的“真香”操作
本文分享了在HarmonyOS NEXT原生开发中,使用模态页面解决考试答题卡显示问题的经验。模态页面分为半模态和全模态,前者适合轻量级操作(如选日期、填备注),后者适用于沉浸式场景(如查看长答题卡)。文章通过“纪念日管理”功能的代码示例,详细讲解了半模态页面的创建、生命周期与交互实现,并展示了从设计到效果的完整流程。最后总结了模态页面的三大优势:灵活适配、友好体验与高度自定义,为开发者提供实用参考。
110 0
一文就可搞清楚的HarmonyOS NEXT解锁模态页面的“真香”操作