HarmonyOS6 半年磨一剑 - RcList 组件核心架构与类型系统设计

HarmonyOS6 半年磨一剑 - RcList 组件核心架构与类型系统设计

文章目录

前言

Hello 各位开发者们大家好, 我是若城,今天我们开始对Rchoui三方库新的组件开始讲解, 本期我们主要讲解的是 RcList 这个组件, 话不多说我们先看下效果图吧~~~

开源计划

项目预计于 2026 年 7 月中旬正式开源,届时可通过三方库直接下载使用。在此期间,我会通过系列文章逐一介绍每个模块的设计思路与实现细节。

rchoui 官网

目前暂定 rchoui 官网地址:http://rchoui.ruocheng.site/

需要注意的是,当前官网还在完善当中,会在后续更新中逐步完善,届时可以为大家提供更加完善的说明文档。

一、组件整体架构

1.1 双组件协作模式

RcList 体系采用容器 + 子项的双组件协作模式:

  • RcList:列表容器,负责滚动控制、边框、间距、背景色、滚动事件派发
  • RcListItem:列表子项,负责单行内容渲染,包含图标、标题、描述、角标、开关、箭头

两者通过 @BuilderParam 插槽机制连接,组合使用时代码结构清晰:

import{ RcList, RcListItem }from'rchoui'RcList(){RcListItem({ rcListItemTitle:'第一项'})RcListItem({ rcListItemTitle:'第二项'})}

这种设计让容器与子项职责分离,容器只管"怎么滚",子项只管"怎么显示",彼此不耦合。

1.2 文件结构

rchoui/src/main/ets/dataComponents/RcList/ ├── index.ets # 组件实现(RcList + RcListItem) ├── index.type.ets # 类型定义(Props、Config 接口) └── README.md # API 文档 

组件将类型定义实现代码完全分离,遵循单一职责原则。类型文件 index.type.ets 可独立引用,方便二次封装。

1.3 依赖关系图

关于RcIcon 在我们之前的章节中已经有所讲解了, 至于该三方库的源码 是否公开,目前还没有想好, 因此这里仅展示了一些设计原则,依赖关系等, 方便开发者在使用时能够更加清晰的理解,为什么这样用,或者 为什么这个ui组件可以通过某种方式来展示等。。

RcList / RcListItem | +-- RcIcon (额外图标渲染) | +-- RcSwitch (开关组件) | +-- RcUIBaseStyle (全局基础样式) | +-- RcGlobalConfig (全局配置) | +-- getSizeByUnit (尺寸工具函数) 
提示:RcIconRcSwitch 是 rchoui 内置的基础组件,RcList 通过组合而非继承的方式复用它们。

二、类型系统设计

2.1 核心类型总览

index.type.ets 中定义了完整的类型体系,分为联合类型接口两大类:

类型名类型形式用途
RcListDirection联合类型列表/子项排列方向
RcListItemThumbSize联合类型缩略图预设尺寸
RcListItemLinkType联合类型页面跳转方式
RcListItemValue联合类型通用值类型
RcListBadgeConfig接口角标配置
RcListExtraIconConfig接口额外图标配置
RcListItemData接口列表数据模型
RcListItemProps接口RcListItem Props
RcListProps接口RcList Props

2.2 方向类型设计

// RcListDirection:支持水平和垂直两种排列exporttypeRcListDirection='row'|'column'

RcListDirection 同时被 RcList(容器方向)和 RcListItem(子项内部排列)使用,复用同一类型约束,避免冗余。

2.3 缩略图尺寸类型

// 预设三档尺寸,也支持直接传数值exporttypeRcListItemThumbSize='small'|'medium'|'large'// 在组件 @Param 中的声明:@Param rcListItemThumbSize: RcListItemThumbSize | RcStringNumber ='medium'

通过 RcListItemThumbSize | RcStringNumber 联合类型,开发者既可使用语义化字符串('small''medium''large'),也可以直接传入自定义数值(如 50),兼顾便捷性和灵活性

三档预设对应像素值:

预设值像素尺寸
'small'40 × 40
'medium'60 × 60
'large'80 × 80
自定义数值N × N

2.4 角标配置接口

exportinterfaceRcListBadgeConfig{// 角标内容,支持数字和字符串 value?:string|number// 角标背景色,默认红色 '#fa3534' color?: ResourceColor // 是否显示点状角标(优先级高于 value) isDot?:boolean// 最大值,超过后显示为 '99+',默认 99 max?:number}

RcListBadgeConfig 的设计充分考虑了真实业务场景

  • 数字角标(未读消息数)
  • 超出最大值自动截断(99+
  • 点状角标(仅提示有新内容,不显示数量)
  • 文字角标(如 'NEW''HOT'

2.5 额外图标配置接口

exportinterfaceRcListExtraIconConfig{// 支持 RcIcon 图标名,也支持本地/网络图片 name:keyof RcIconDataType | ResourceStr color?: ResourceColor size?: RcStringNumber // 默认 20}

name 字段使用 keyof RcIconDataType | ResourceStr 联合类型,使得:

  • 传入 'icon-houi_bell_outline' 等字符串时,使用内置矢量图标
  • 传入 $r('app.media.xxx') 或 URL 时,使用图片资源

这是类型引导开发的典型体现,IDE 可以为 keyof RcIconDataType 提供自动补全。

2.6 列表数据模型

exportinterfaceRcListItemData{ id?:string|number title?:string note?:string thumb?: ResourceStr rightText?:string badge?: RcListBadgeConfig extraIcon?: RcListExtraIconConfig disabled?:boolean customData?: Record<string, ESObject>// 自定义扩展数据}

RcListItemData 是为数据驱动渲染预留的数据模型,customData 字段允许携带任意业务数据,具有良好的可扩展性。


三、RcList 容器核心实现

3.1 关键 @Param 属性

@ComponentV2export struct RcList {// 是否显示外层边框@Param rcListBorder:boolean=false// 列表高度(为 0 且 rcListScrollable 为 true 时不启用滚动)@Param rcListHeight: RcStringNumber =0// 是否启用滚动(需要配合 rcListHeight 使用)@Param rcListScrollable:boolean=true// 滚动条状态@Param rcListScrollBarState: BarState = BarState.Auto // 边缘弹性效果@Param rcListEdgeEffect: EdgeEffect = EdgeEffect.Spring // 外部注入的滚动控制器@Param rcListScroller: Scroller =newScroller()// 内容插槽@BuilderParamrcListContentBuilder:()=>void=this.rcListDefaultContent }
提示:rcListHeightrcListScrollable 需要同时满足才会渲染可滚动容器。这是一种防误用的设计——避免开发者忘记设置高度导致滚动失效。

3.2 滚动事件三元组

RcList 对外暴露三个滚动相关事件:

// 实时滚动偏移量(每帧触发)@EventonRcListScroll:(scrollOffset:number, scrollState: ScrollState)=>void=()=>{}// 滚动到底部(加载更多的触发点)@EventonRcListScrollToLower:()=>void=()=>{}// 滚动到顶部(下拉刷新的触发点)@EventonRcListScrollToUpper:()=>void=()=>{}

内部通过 handleRcListScrollhandleRcListScrollEdge 两个方法处理 ArkUI Scroll 组件的原生事件,并转化为更语义化的上层事件。

3.3 @BuilderParam 插槽机制

// 内容插槽声明@BuilderParamrcListContentBuilder:()=>void=this.rcListDefaultContent // 默认空实现@BuilderrcListDefaultContent(){}

使用方通过尾随闭包语法填充列表内容:

RcList({ rcListBorder:true}){// 这里的内容会被注入到 rcListContentBuilder 中RcListItem({ rcListItemTitle:'设置项 A'})RcListItem({ rcListItemTitle:'设置项 B'})}

这是 ArkUI @BuilderParam 的标准用法,等效于 Web 开发中的 slot 插槽机制。


四、RcListItem 结构划分

4.1 四区布局模型

每个 RcListItem 的水平布局分为四个区域:

|---额外图标区---|---缩略图区---|---主体内容区(flex:1)---|---右侧操作区---| 

对应四个 @Builder 方法:

@BuilderrenderRcListItemExtraIcon()// 左侧图标(extraIcon)@BuilderrenderRcListItemThumb()// 左侧缩略图(thumb + badge)@BuilderrenderRcListItemBody()// 中间标题 + 描述@BuilderrenderRcListItemFooter()// 右侧文字/开关/箭头

主体内容区使用 .layoutWeight(1) 占据剩余空间,左右两侧区域按内容自适应宽度。

4.2 主体内容区渲染

@BuilderrenderRcListItemBody(){Column({ space:4}){if(this.rcListItemTitle){Text(this.rcListItemTitle).fontSize(15)// 禁用时文字变灰.fontColor(this.rcListItemDisabled ?'#c0c4cc':'#303133').fontWeight(FontWeight.Medium)}if(this.rcListItemNote){Text(this.rcListItemNote).fontSize(13).fontColor('#909399')// 限制行数与省略号:rcListItemEllipsis 为 1-5 时生效.maxLines(this.rcListItemEllipsis >0&&this.rcListItemEllipsis <=5?this.rcListItemEllipsis :undefined).textOverflow(this.rcListItemEllipsis >0?{ overflow: TextOverflow.Ellipsis }:undefined)}}.alignItems(HorizontalAlign.Start).layoutWeight(1)}

描述文本的 maxLinestextOverflow 联动控制,rcListItemEllipsis 取值范围限定在 1-5,超出范围则不限制行数,这是一种防御性参数校验

4.3 右侧操作区互斥逻辑

@BuilderrenderRcListItemFooter(){Row({ space:8}){// 右侧文字(可与开关/箭头共存)if(this.rcListItemRightText){Text(this.rcListItemRightText).fontSize(14).fontColor('#909399')}if(this.rcListItemShowSwitch){// 优先显示开关RcSwitch({...})}elseif(this.rcListItemShowArrow &&!this.rcListItemShowSwitch){// 没有开关时才显示箭头RcIcon({ name:'icon-houi_chevron_right_outline', iconSize:16, color:'#c0c4cc'})}}}

开关与箭头互斥是业务逻辑的体现:有开关的项目不需要箭头引导跳转。条件判断层次清晰,避免了两者同时显示的 UI 冲突。

总结

RcListRcListItem 构成的双组件体系,是 HarmonyOS6 ArkUI 场景下列表开发的高效解法。其核心设计理念包括:类型驱动开发(完整的 TypeScript 类型约束)、职责分离(容器与子项解耦)、全局主题集成(AppStorageV2 响应式配置)以及渲染分支策略(滚动与静态的智能切换)。

掌握了本篇的架构原理,你已经对整个组件体系有了扎实的底层认知,后续深入缩略图、角标、交互、实战等专题时将会更加游刃有余。

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

Read more

Flutter for OpenHarmony: Flutter 三方库 platform_info 为鸿蒙多端应用提供精准的运行时环境感知(平台适配大脑)

Flutter for OpenHarmony: Flutter 三方库 platform_info 为鸿蒙多端应用提供精准的运行时环境感知(平台适配大脑)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 应用开发时,“环境感知”是一切进阶逻辑的基石。 * 当前是鸿蒙手机还是平板? * 应用是处于 Debug 调试态还是 Release 发布态? * 底层硬件到底有多少核处理器? 然而,由于 platform_info (v5.0.0) 尚未正式支持 OpenHarmony,直接调用会导致系统被识别为 Unknown,甚至让关键的 isMobile 判定失效。为了解决这一痛点,我们对该库进行了“手术级”的源码适配。 一、环境感知适配模型 我们将底层的系统标识符转化为 Flutter 开发者熟悉的强类型对象。 底层系统 ('ohos') 补丁适配层 (vm_host_platform) 强类型枚举

By Ne0inhk
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石 前言 随着鸿蒙(OpenHarmony)生态向 PC 和平板端的高速扩张,如何为海量的三方软件建立一套标准化的“数字档案”,成了构建应用商店生态的核心痛点。过去,开发者提交应用信息时,往往采用碎片化的 JSON 或自定义文档。这会导致软件分发时详情页展示不一、多语言支持混乱,甚至连基本的截图和版本日志都难以对齐。 为了解决这个问题,我们需要引入一套具备全球化视野的元数据定义标准。appstream 作为 Linux 生态下最重要的应用信息描述规范,能够通过结构化的 XML 标签,精准定义软件的身世、功能和展示资产。适配到鸿蒙平台后,它不仅能让你的重型“鸿蒙私有应用商店”瞬间具备吞金般的解析能力,

By Ne0inhk

Flutter 三方库 http_status_code 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、工业级的网络响应审计与 HTTP 状态码语义化控制引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 http_status_code 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、工业级的网络响应审计与 HTTP 状态码语义化控制引擎 在鸿蒙(OpenHarmony)系统的端云一体化网络库封装、政企级应用的网络错误诊断、或者是针对复杂的 REST API 全生命周期监听中,如何摆脱凌乱的 magic number(如 404, 500),转而使用具备自描述性、且完全符合 RFC 规范的语义化常量?http_status_code 为开发者提供了一套工业级的、基于标准定义的 HTTP 状态码枚举与描述查询方案。本文将深入实战其在鸿蒙网络安全架构中的应用。 前言 什么是 HTTP Status Code?它是 Web

By Ne0inhk
【Linux:文件 + 进程】进程间通信进阶(2)

【Linux:文件 + 进程】进程间通信进阶(2)

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 文章目录 * 7 ~> 消息队列 * 7.1 消息队列的概念 * 7.2 消息队列的原理 * 7.3 消息队列的接口 * 7.4 消息队列的一些命令 * 8 ~> 信号量 * 8.1 概念补充 * 8.1.1 共享资源和临界资源 * 8.1.2 互斥和同步

By Ne0inhk