环信鸿蒙版 UIKit 快速上手指南
环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库,基于环信 IM SDK 开发,可帮助开发者快速集成即时通讯功能。
环信UIKit 的特点
- ArkUI 声明式开发范式:采用高效简洁的声明式开发方式
- 状态管理 V2:支持深度观测和精准更新
- 组件导航:使用系统推荐的 Navigation 方式进行页面跳转
1. 使用 ArkUI 的声明式开发范式。
ArkUI 提供了两种开发范式:基于ArkTS的声明式开发范式和兼容JS的类Web开发范式。声明式开发范式具有高效简洁,内存占用少,性能更佳以及会作为鸿蒙主推的开发范式持续演进的特点。而类Web开发范式则是为了让Web前端开发者快速将已有的Web应用改造成方舟UI框架应用。基于以上原因,环信Chat UIKit 采用 ArkUI 的声明式开发范式。
2. 采用状态管理 V2 版本。
ArkUI 提供了两个版本的状态管理:状态管理V1和V2。状态管理 V1 版本是目前 ArkUI 的稳定版本,但是在使用上有如下限制:
- 状态变量不能独立于UI存在,同一个数据被多个视图代理时,在其中一个视图的更改不会通知其他视图更新。
- 只能感知对象属性第一层的变化,无法做到深度观测和深度监听。
- 在更改对象中属性以及更改数组中元素的场景下存在冗余更新的问题。
- 装饰器间配合使用限制多,不易用。组件中没有明确状态变量的输入与输出,不利于组件化。
而状态管理 V2 则增强了状态管理 V1 的能力,解决了状态管理 V1 版本的一些问题。状态管理 V2 版本的特点如下:
- 状态变量独立于UI,更改数据会触发相应视图的更新。
- 支持对象的深度观测和深度监听,且深度观测机制不影响观测性能。
- 支持对象中属性级精准更新及数组中元素的最小化更新。
- 装饰器易用性高、拓展性强,在组件中明确输入与输出,有利于组件化。
基于 V1 和 V2 版本的对比,结合 UIKit 聊天页面的复杂性,环信UIKit 采用了 V2 版本的状态管理。
3. 页面采用组件导航(Navigation)的方式。
组件导航(Navigation)是鸿蒙推荐的页面导航方式。UIKit 采用系统路由表的方式进行动态路由。应用只需要通过NavPathStack提供的路由方法,传入需要路由的页面配置名称,系统会完成路由跳转。
快速使用环信鸿蒙版 UIKit
前提条件
开始前,你需要满足以下的开发环境:
- DevEco Studio NEXT Release(5.0.3.900)及以上;
- HarmonyOS SDK API 12 及以上;
- HarmonyOS NEXT.0.0.71 或以上版本的模拟器或者真机;
- 有效的环信即时通讯 IM 开发者账号和 App Key,请跳转到 环信即时通讯云控制台
项目准备
下面介绍将单群聊 UIKit 引入项目中的必要环境配置。
-
打开 DevEco Studio,点击 Create Project。
-
在 Choose Your Ability Template 界面,选择 Application > Empty Ability,然后点击 Next。
-
在 Configure Your Project 界面,依次填入以下内容:
- Project name:你的 HarmonyOS 项目名称,如 HelloWorld。
- Bundle name:你的项目包的名称,如 com.hyphenate.helloworld。
- Save location:项目的存储路径。
- Compatible SDK:项目的支持的最低 API 等级,选择
5.0.0(12)及以上。 - Module name:module的名称,默认为
entry。
-
点击 Finish。根据屏幕提示,安装所需插件。
注意:上述步骤使用的是 DevEco Studio 5.0.1 Release(5.0.5.315)版本。
- 在项目中引入 SDK 。
远程依赖
在项目根目录下执行如下命令:
ohpm install @easemob/chatuikit
说明一下:
上面的命令在根目录执行,会将 SDK 依赖添加到项目级别;在 Module 目录下,会将 SDK 依赖添加到对应的 Module 上。
源码依赖
从 环信官网 或从 GitHub 获取鸿蒙单群聊UIKit源码源码,按照下面的方式集成:
- 点击 Import,选择 Import Module,导入
chatuikit模块。 - 在项目 Module 中引入
chatuikit模块。
修改模块目录的 oh-package.json5 文件,在 dependencies 节点增加依赖声明。
"dependencies": {"@easemob/chatuikit": "file:./../chatuikit"
}
然后点击同步按钮,同步完成后,就可以在模块中使用 chatuikit 。
- 添加项目权限。
在模块的 module.json5 ,例如:HelloWorld 中 entry 模块的 module.json5 中,配置示例如下:
{module: {requestPermissions: [{name: "ohos.permission.GET_NETWORK_INFO",},{name: "ohos.permission.INTERNET",},{"name": "ohos.permission.MICROPHONE","reason": "$string:record_permission_reason",'usedScene': {"abilities": ["EntryAbility"],"when": "always"}}],},
}
需要在对应模块的 string.json 文件中增加如下:
{"name": "record_permission_reason","value": "录制语音需要"
}
实现发送第一条单聊消息
下面我们一起来看看 UIKit 是如何发送第一条消息的。
创建快速开始页面及实现代码逻辑
- 打开
entry/src/main/ets/pages/Index.ets文件,并替换为如下内容:
import { ChatPageParams, ChatUIKitClient, ChatClient, ChatError, ChatOptions, ConversationType } from '@easemob/chatuikit';
import { promptAction } from '@kit.ArkUI';@Entry
@Component
struct Index {pathStack: NavPathStack = new NavPathStack();private appKey: string = [项目的AppKey]; // 将[项目的AppKey]替换为项目的AppKey字符串private userId: string = '';private password: string = '';private peerId: string = '';private initSDK() {let options = new ChatOptions({appKey: this.appKey});options.setAutoLogin(false);let client = ChatClient.getInstance();client.init(getContext(), options);ChatUIKitClient.init(client);}private login() {if (!this.userId || !this.password) {promptAction.showToast({message: "UserId or password cannot be empty!"});return;}ChatUIKitClient.loginWithPassword(this.userId, this.password).then(() => {promptAction.showToast({message: "Login successful!"});}).catch((e: ChatError) => {promptAction.showToast({message: "Login failed: "+e.description});})}private logout() {ChatUIKitClient.logout(false).then(() => {promptAction.showToast({message: "Logout successful!"});})}private startChat() {if (!this.peerId) {promptAction.showToast({message: "Peer id cannot be empty!"});return;}this.pathStack.pushPath({name: 'ChatPage', param: {conversationId: this.peerId,conversationType: ConversationType.Chat} as ChatPageParams})}aboutToAppear(): void {this.initSDK();}build() {Navigation(this.pathStack) {Column() {TextInput({placeholder: 'UserId'}).commonStyle().onChange(value => this.userId = value)TextInput({ placeholder: 'Password' }).commonStyle().type(InputType.Password).onChange(value => this.password = value)Button('Login').commonStyle().onClick(()=> {this.login();})Button('Logout').commonStyle().onClick(()=> {this.logout();})TextInput({placeholder: 'PeerId'}).commonStyle().onChange(value => this.peerId = value)Button('Start Chat').commonStyle().onClick(()=> {this.startChat();})}.width('100%').height('100%')}}@StylescommonStyle() {.width('80%').margin({top: 20})}
}
重要:请将代码中的
appKey值([项目的AppKey])替换为您项目的实际AppKey字符串。
- 现在可以测试你的应用了。
测试应用
-
在 DevEco Studio 中,点击
Run ‘entry’按钮,将应用运行到你的设备或者模拟器上。 -
输入用户 ID 和密码,点击
Login按钮进行登录,登录成功或者失败有提示,或者通过 Log 查看。 -
在另一台设备或者模拟器上登录另一个账号。
-
在两台设备或模拟器上分别登录不同账号,输入对方的账号ID,点击
Start Chat按钮即可开始聊天。
总结一下
环信鸿蒙版UIKit是环信开发的一个鸿蒙版的 UI 组件库,采用 ArkUI 的声明式开发范式,采用状态管理 V2 版本,采用组件导航的方式。环信鸿蒙版UIKit可以让开发者更加方便地使用环信的 IM SDK,同时也可以让大家更加方便地进行 UI 组件的开发。
相关文档:
-
注册环信即时通讯IM:https://console.easemob.com/user/register
-
环信IM集成文档:https://docs-im-beta.easemob.com/document/ios/quickstart.html
相关文章:
环信鸿蒙版 UIKit 快速上手指南
环信鸿蒙版 UIKit 是专为 HarmonyOS 开发者设计的 IM UI 组件库,基于环信 IM SDK 开发,可帮助开发者快速集成即时通讯功能。 环信UIKit 的特点 ArkUI 声明式开发范式:采用高效简洁的声明式开发方式状态管理 V2:支持深度观测和精…...
核心机制与主流协议解析
一、收益聚合器的核心逻辑 收益聚合器(Yield Aggregator)通过算法自动优化用户在DeFi协议中的资金配置,解决「收益耕作(Yield Farming)」的两大痛点: 机会捕捉:实时追踪高收益矿池(…...
使用stm32cubeide stm32f407 lan8720a freertos lwip 实现udp client网络数据转串口数据过程详解
1前言 项目需要使用MCU实现网络功能,后续确定方案stm32f407 外接lan8720a实现硬件平台搭建,针对lan8720a也是用的比较多的phy,网上比较多的开发板,硬件上都是选用了这个phy,项目周期比较短,选用了这个常用…...
Go:入门
文章目录 Hello, World命令行参数找出重复行GIF动画获取一个URL并发获取多个URL一个 Web 服务器其他 Hello, World Hello world package main import "fmt" func main() {fmt.Println("Hello, 世界") }package main表明这是一个可独立执行的程序包&#…...
createContext+useContext+useReducer组合管理React复杂状态
createContext、useContext 和 useReducer 的组合是 React 中管理全局状态的一种常见模式。这种模式非常适合在不引入第三方状态管理库(如 Redux)的情况下,管理复杂的全局状态。 以下是一个经典的例子,展示如何使用 createContex…...
JVM常见问题与调优
目录 一、内存管理问题 1、内存泄漏(Memory Leak) 2、内存溢出(OOM, OutOfMemoryError) 2.1 堆内存溢出(OutOfMemoryError: Java heap space) 2.2 元空间溢出(OutOfMemoryError: Metaspace…...
汽车售后诊断 ODX 和 OTX 对比分析报告
一、引言 在汽车行业不断发展的当下,汽车售后诊断技术对于保障车辆性能、维护车主权益以及提升汽车品牌服务质量起着至关重要的作用。随着汽车电子化程度的不断提高,售后诊断所涉及的数据和流程愈发复杂,这就促使行业需要更加标准化、高效化…...
AI重构农业:从“面朝黄土“到“数字原野“的产业跃迁—读中共中央 国务院印发《加快建设农业强国规划(2024-2035年)》
在东北黑土地的万亩良田上,无人机编队正在执行精准施肥作业;在山东寿光的智慧大棚里,传感器网络实时调控着番茄生长的微环境;在云南的咖啡种植园中,区块链溯源系统记录着每粒咖啡豆的旅程。这场静默的农业革命…...
go游戏后端开发33:解散房间
接下来,我们来实现房间的解散功能。因为在调试过程中,如果不能取消房间,就需要频繁重启程序,这非常不方便。所以,我们先来实现这个解散功能。 房间解散的流程其实很简单。当发起解散请求后,我们会向所有用…...
Cloudflare教程:免费优化CDN加速配置,提升网站访问速度 | 域名访问缓存压缩视频图片媒体文件优化配置
1、启用 Tiered Cache 缓存开关:通过选择缓存拓扑,可以控制源服务器与 Cloudflare 数据中心的连接方式,以确保缓存命中率更高、源服务器连接数更少,并且 Internet 延迟更短。 2、增加浏览器缓存时间TTL:在此期间&#…...
Python设计模式:策略模式
1. 什么是策略模式 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法的变化独立于使用算法的客户。换句话说,策略模式允许在运…...
JavaScript(JS进阶)
目录 00闭包 01函数进阶 02解构赋值 03通过forEach方法遍历数组 04深入对象 05内置构造函数 06原型 00闭包 <!-- 闭包 --><html><body><script>// 定义:闭包内层函数(匿名函数)外层函数的变量(s&…...
C/C++共有的类型转换与c++特有的四种强制类型转换
前言 C 语言和 C 共有的类型转换: 自动类型转换(隐式类型转换): 编译器在某些情况下会自动进行的类型转换。强制类型转换(显示类型转换): 使用 (type)expression 或 type(expression) 语法进行…...
Nginx 负载均衡案例配置
负载均衡案例 基于 docker 进行 案例测试 1、创建三个 Nginx 实例 创建目录结构 为每个 Nginx 实例创建单独的目录,用于存储 HTML 文件和配置文件 mkdir -p data/nginx1/html mkdir -p data/nginx2/html mkdir -p data/nginx3/html添加自定义 HTML 文件 在每个…...
【蓝桥杯】贪心算法
1. 区间调度 1.1. 题目 给定个区间,每个区间由开始时间start和结束时间end表示。请选择最多的互不重叠的区间,返回可以选择的区间的最大数量。 输入格式: 第一行包含一个整数n,表示区间的数量 接下来n行,每行包含两个整数,分别表示区间的开始时间和结束时间 输出格式:…...
LLaMA-Factory 数据集成从入门到精通
一、框架概述 LLaMA-Factory 框架通过Alpaca/Sharegpt双格式体系实现多任务适配,其中Alpaca专注结构化指令微调(含SFT/DPO/预训练),Sharegpt支持多角色对话及多模态数据集成。核心配置依托 dataset_info.json 实现数据源映射、格…...
数据库架构
常见数据库架构类型及其优势解析 1. 集中式架构(Centralized Architecture) 定义:所有数据存储在单个服务器或主机上,由中央处理器统一管理。核心优势: ✅ 数据一致性:单一数据源避免数据冗余和不一致。 …...
OSPF接口的网络类型和不规则区域
网络类型(数据链路层所使用的协议所构建的二层网络类型) 1、MA --- 多点接入网络 BMA --- 支持广播的多点接入网络 NBMA --- 不支持广播的多点接入网络 2、P2P --- 点到点网络 以太网 --- 以太网最主要的特点是需要基于MAC地址进行物理寻址,主要是因为以太网接口所连…...
MySQL SQL Mode
SQL Mode 是 MySQL 中一个重要的系统变量,它决定了 MySQL 应遵循的 SQL 语法规则和数据验证规则。 什么是 SQL Mode SQL Mode 定义了 MySQL 应该支持的 SQL 语法以及执行数据验证的方式。通过设置不同的 SQL Mode,可以让 MySQL 在不同程度上兼容其他数据…...
Mysql备忘记录
1、简介 Mysql操作经常忘记命令,本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…...
idea 创建 maven-scala项目
文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1)创建scala目录并标记成【源目录】2)导入scala环境3)测试环境 idea 创建 maven-scala项目 1、创建普通maven项目并且配置pom.xml文件 maven依赖…...
ansible+docker+docker-compose快速部署4节点高可用minio集群
目录 github项目地址 示例服务器列表 安装前 修改变量文件group_vars/all.yml 修改ansible主机清单 修改setup.sh安装脚本 用法演示 安装后验证 github项目地址 https://github.com/sulibao/ansible_minio_cluster.git 示例服务器列表 安装前 修改变量文件group_var…...
使用libcurl编写爬虫程序指南
用户想知道用Curl库编写的爬虫程序是什么样的。首先,我需要明确Curl本身是一个命令行工具和库,用于传输数据,支持多种协议。而用户提到的“Curl库”可能指的是libcurl,这是一个客户端URL传输库,可以用在C、C等编程语言…...
K8S学习之基础七十五:istio实现灰度发布
istio实现灰度发布 上传镜像到harbor 创建两个版本的pod vi deployment-v1.yaml apiVersion: apps/v1 kind: Deployment metadata:name: appv1labels:app: v1 spec:replicas: 1selector:matchLabels:app: v1apply: canarytemplate:metadata:labels:app: v1apply: canaryspec…...
【设备连接涂鸦阿里云】
设备连接涂鸦阿里云 ■ Tuya IoT on Alibaba Cloud■ 控制台操作步骤■ 1. 创建产品■ 2. 添加设备■ 3. 添加设备■ 4. 获取设备MQTT连接参数 ■ MQTTX使用教程■ 1,先在 Tuya IoT on Alibaba Cloud 新建产品和设备■ 2,MQTTX 设置■ 3,MQTT…...
c语言学习16——内存函数
内存函数 一、memcpy使用和模拟实现1.1参数1.2 使用1.3 模拟实现 二、memmove使用和模拟实现2.1 参数2.2 使用2.3 模拟实现 三、memset使用3.1 参数3.2 使用 四、memcmp使用4.1 参数4.2 使用 一、memcpy使用和模拟实现 1.1参数 因为内存中不知道存的是什么类型的地址ÿ…...
渗透测试实战:使用Hydra破解MySQL弱口令(附合法授权流程+防御方案)
渗透测试实战:使用Hydra破解MySQL弱口令(附合法授权流程防御方案) 郑重声明:本文仅供安全学习研究,任何未经授权的网络攻击行为均属违法。实操需获得目标系统书面授权,请遵守《网络安全法》相关规定。 一、…...
一文了解亿级数据检索:RedisSearch
文章目录 1.什么是Redis Search2.为什么要使用Redis Search3.RedisSearch 的核心特性4.RedisSearch 的原理4.1 倒排索引4.2 索引创建与数据存储4.3 数据模型4.4 搜索查询处理4.5 高性能与可扩展性: 5.有了ES为什么还需要RedisSearch5.RedisSearch的安装6.RedisSearc…...
uniApp开发微信小程序-连接蓝牙连接打印机上岸!
历经波折三次成功上岸! 三次经历简单絮叨一下:使用uniAppvue开发的微信小程序,使用蓝牙连接打印机,蓝牙所有的接口都是插件中封装的,用的插件市场中的这个: dothan-lpapi-ble ;所以,…...
Spring Boot 线程池配置详解
Spring Boot 线程池配置详解 一、核心配置参数及作用 基础参数核心线程数 (corePoolSize) 作用:线程池中始终保持存活的线程数量,即使空闲也不回收。 建议:根据任务类型设定(如 I/O 密集型任务可设为 CPU 核心数 2)。 最大线程数 (maxPoolSize) 作用:…...
