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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*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);

总结

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

目录
相关文章
|
26天前
|
缓存 自然语言处理 监控
基于通义大模型的智能客服系统构建实战:从模型微调到API部署
本文详细解析了基于通义大模型的智能客服系统构建全流程,涵盖数据准备、模型微调、性能优化及API部署等关键环节。通过实战案例与代码演示,展示了如何针对客服场景优化训练数据、高效微调大模型、解决部署中的延迟与并发问题,以及构建完整的API服务与监控体系。文章还探讨了性能优化进阶技术,如模型量化压缩和缓存策略,并提供了安全与合规实践建议。最终总结显示,微调后模型意图识别准确率提升14.3%,QPS从12.3提升至86.7,延迟降低74%。
262 14
|
1月前
|
定位技术 UED
70. [HarmonyOS NEXT 实战案例九] 旅游景点网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的旅游景点网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的旅游景点应用。
60 1
|
1月前
|
容器
69.[HarmonyOS NEXT 实战案例九] 旅游景点网格布局(上)
本教程将详细讲解如何使用HarmonyOS NEXT中的GridRow和GridCol组件实现旅游景点网格布局。通过网格布局,我们可以以美观、规整的方式展示各种旅游景点信息,为用户提供良好的浏览体验。
57 1
|
1月前
|
UED
68.[HarmonyOS NEXT 实战案例八] 电影票务网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的电影票务网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的电影票务应用。
56 1
|
1月前
|
开发者 容器
67.[HarmonyOS NEXT 实战案例八] 电影票务网格布局(上)
在移动应用开发中,电影票务应用是一个常见的场景,用户可以通过应用查看正在热映的电影信息,并进行选座购票等操作。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现电影票务应用中的电影列表网格布局,帮助开发者掌握网格布局的基本用法和实现技巧。
58 1
|
1月前
|
UED
66.[HarmonyOS NEXT 实战案例七] 健身课程网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的健身课程网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的健身课程应用。
60 1
|
1月前
|
设计模式 UED
65. [HarmonyOS NEXT 实战案例七] 健身课程网格布局(上)
本教程将介绍如何使用HarmonyOS NEXT的GridRow和GridCol组件实现健身课程的网格布局展示。健身课程网格布局是一种常见的UI设计模式,适用于展示各种健身课程信息,包括课程名称、教练信息、课程时长、难度级别等。通过网格布局,用户可以快速浏览多个课程,并根据自己的需求选择合适的课程。
59 1
|
1月前
|
设计模式 容器
61.[HarmonyOS NEXT 实战案例五] 社交应用照片墙网格布局(上)
社交应用中的照片墙是一种常见的UI设计模式,它以网格形式展示用户的照片集合,让用户可以浏览、分享和互动。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现一个美观、灵活的社交应用照片墙网格布局。 在本教程中,我们将学习如何设计照片墙的数据结构、如何使用GridRow和GridCol组件创建网格布局、如何实现照片卡片,以及如何处理不同尺寸的照片。通过本教程,你将掌握使用GridRow和GridCol组件实现复杂网格布局的技巧。
56 1
|
1月前
64.[HarmonyOS NEXT 实战案例六] 餐饮菜单网格布局(下)
在上一篇教程中,我们学习了如何使用GridRow和GridCol组件实现基本的餐饮菜单网格布局。本篇教程将在此基础上,深入探讨如何优化布局、添加交互功能,以及实现更多高级特性,打造一个功能完善的餐饮菜单应用。
61 0
|
1月前
|
存储
63.[HarmonyOS NEXT 实战案例六] 餐饮菜单网格布局(上)
在移动应用开发中,餐饮类应用的菜单展示是一个常见的需求。一个设计良好的菜单布局不仅能够清晰地展示菜品信息,还能提升用户的点餐体验。本教程将详细讲解如何使用HarmonyOS NEXT的GridRow和GridCol组件实现一个美观实用的餐饮菜单网格布局。
57 0

热门文章

最新文章