鸿蒙Next实战开发四个人中心与系统设置页面开发系列第四篇我们来实现智慧生活App的最后两个页面——个人中心和数据设置页。包含头像卡片、数据统计、功能菜单、Toggle开关、字体选择、AlertDialog弹窗等交互。一、页面概览本篇覆盖两个页面页面文件用途 个人中心Index.ets中ProfileContent用户信息、数据统计、功能入口⚙️ 系统设置SettingsPage.ets显示/通知/数据设置、关于信息二、个人中心模块个人中心是 Tabs 底部导航的第四个 Tab作为用户个人信息的聚合入口。2.1 整体布局┌─────────────────────────┐ │ │ ← 头像 │ HarmonyOS 开发者 │ ← 昵称 │ 探索智慧生活连接无限可能 │ ← 签名 ├──────┬──────┬──────────┤ │ │ ✅ │ │ ← 数据统计 │ 5 │ 6 │ 7天 │ │ 笔记 │ 待办 │ 连续 │ ├──────┴──────┴──────────┤ │ 功能设置 │ │ 深色模式 跟随系统 ›│ ← 菜单列表 │ 消息通知 已开启 ›│ │ 隐私设置 ›│ │ ⚙️ 系统设置 ›│ ← 可跳转 │ 使用帮助 ›│ │ ℹ️ 关于应用 v1.0.0 ›│ └─────────────────────────┘2.2 头像与个人信息使用 emoji 做轻量头像避免加载图片资源的复杂性// 头像Column(){Text().fontSize(52);}.width(80).height(80).backgroundColor(#FFE8F0FE).borderRadius(40).alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center);Text(HarmonyOS 开发者).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Text(探索智慧生活连接无限可能).fontSize(14).fontColor($r(app.color.text_tertiary));2.3 数据统计三卡片通过Builder buildStatCard复用卡片样式BuilderbuildStatCard(icon:string,label:string,value:string){Column({space:6}){Text(icon).fontSize(24);Text(value).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Text(label).fontSize(12).fontColor($r(app.color.text_tertiary));}.layoutWeight(1).padding(16).backgroundColor($r(app.color.card_background)).borderRadius(16).shadow({radius:4,color:#0A000000,offsetY:1}).alignItems(HorizontalAlign.Center);}使用Row({space:12}){this.buildStatCard(,笔记,5);this.buildStatCard(✅,待办,6);this.buildStatCard(,连续,7天);}.width(100%).padding({left:16,right:16});2.4 功能菜单列表在 ArkTS 中我们可以编写多个Builder来处理不同类型的菜单项普通菜单项仅展示BuilderbuildMenuItem(icon:string,label:string,detail:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary));}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:8});}.width(100%).padding({top:14,bottom:14});}带路由跳转的菜单项BuilderbuildMenuLinkItem(icon:string,label:string,detail:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary));}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:8});}.width(100%).padding({top:14,bottom:14}).onClick((){router.pushUrl({url:pages/SettingsPage});});}为什么拆分两个 Builder因为 ArkTS 的Builder函数不支持条件判断路由跳转——如果点击事件需要区分不同行为要么拆分 Builder要么传入回调函数。使用方式Column({space:1}){this.buildMenuItem(,深色模式,跟随系统);this.buildMenuItem(,消息通知,已开启);this.buildMenuItem(,隐私设置,);this.buildMenuLinkItem(⚙️,系统设置,);this.buildMenuItem(,使用帮助,);this.buildMenuItem(ℹ️,关于应用,v1.0.0);}.width(100%).backgroundColor($r(app.color.card_background)).borderRadius(16).shadow({radius:4,color:#0A000000,offsetY:1}).padding({left:16,right:16});三、系统设置页面3.1 功能清单系统设置页是独立路由页面通过router.pushUrl跳转进入包含区域功能交互组件显示设置深色模式Toggle 开关显示设置字体大小小/中/大点击选择通知设置消息通知Toggle 开关通知设置声音提醒Toggle 开关通知设置震动反馈Toggle 开关数据存储自动同步Toggle 开关数据存储清除缓存AlertDialog 确认数据存储导出数据点击关于应用版本/构建版本/开源许可展示3.2 顶部导航栏Row(){Text(← 返回).fontSize(16).fontColor($r(app.color.primary_color)).onClick((){router.back();});Blank();Text(系统设置).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Blank();Row().width(50);// 占位保持对称}3.3 Toggle 开关组件鸿蒙的Toggle组件支持三种类型Switch、Checkbox、Button。构建可复用的开关行BuilderbuildToggleItem(icon:string,label:string,checked:boolean,onChange:(value:boolean)void){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);Toggle({type:ToggleType.Switch,isOn:checked}).onChange((value:boolean){onChange(value);});}.width(100%).padding({top:10,bottom:10});}使用this.buildToggleItem(,深色模式,this.darkMode,(value:boolean){this.darkModevalue;});this.buildToggleItem(,消息通知,this.notificationEnabled,(value:boolean){this.notificationEnabledvalue;});3.4 字体大小选择使用三个标签按钮实现单选效果BuilderbuildSizeOption(label:string,value:number){Text(label).fontSize(12).fontColor(this.fontSizevalue?Color.White:$r(app.color.text_primary)).backgroundColor(this.fontSizevalue?$r(app.color.primary_color):#FFF3F4F6).padding({left:12,right:12,top:4,bottom:4}).borderRadius(12).onClick((){this.fontSizevalue;});}使用Row({space:4}){this.buildSizeOption(小,0);this.buildSizeOption(中,1);this.buildSizeOption(大,2);}3.5 AlertDialog 确认弹窗当用户点击清除缓存时弹出确认对话框this.buildClickItem(️,清除缓存,12.5 MB,(){AlertDialog.show({title:清除缓存,message:确定要清除所有缓存数据吗,primaryButton:{value:取消,action:(){}},secondaryButton:{value:确定,action:(){// 执行清除操作}},cancel:(){}});});AlertDialog.show的参数配置参数类型说明titlestring弹窗标题messagestring弹窗内容primaryButtonobject主按钮左侧secondaryButtonobject次按钮右侧cancelfunction点击遮罩层或按返回键的回调3.6 可点击的菜单项BuilderbuildClickItem(icon:string,label:string,detail:string,onClick:()void){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary)).margin({right:8});}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:4});}.width(100%).padding({top:14,bottom:14}).onClick((){onClick();});}3.7 信息展示项BuilderbuildInfoItem(icon:string,label:string,value:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);Text(value).fontSize(14).fontColor($r(app.color.text_tertiary));}.width(100%).padding({top:14,bottom:14});}3.8 分区布局设置页面按功能分区组织每个分区有标题和卡片容器// 显示设置Text(显示设置).fontSize(16).fontWeight(FontWeight.Medium);Column({space:0}){this.buildToggleItem(,深色模式,this.darkMode,...);this.buildDivider();// 字体大小行}.backgroundColor($r(app.color.card_background)).borderRadius(16).padding({left:16,right:16});// 分割线BuilderbuildDivider(){Row().width(100%).height(1).backgroundColor($r(app.color.divider_color));}每个分区间的Text标题 Column卡片容器 构成清晰的视觉分组。四、状态管理多个 State 变量协设置页有 6 个State变量管理不同的设置项StatedarkMode:booleanfalse;StatenotificationEnabled:booleantrue;StatesoundEnabled:booleantrue;StatevibrationEnabled:booleantrue;StateautoSync:booleanfalse;StatefontSize:number1;每个Toggle组件的onChange回调直接更新对应的State变量ArkUI 框架会自动追踪变化并触发重新渲染。这种模式称为“状态驱动UI”——开发者只管理状态UI 由框架自动更新。五、Builder 传回调函数模式本篇文章中多次使用了传入回调函数的 Builder 模式这是 ArkTS 中实现组件复用和交互分离的关键技巧// 定义接收 onChange 回调BuilderbuildToggleItem(icon:string,label:string,checked:boolean,onChange:(value:boolean)void// ← 回调函数类型){Toggle({type:ToggleType.Switch,isOn:checked}).onChange((value:boolean){onChange(value);});}// 使用传入具体的回调实现this.buildToggleItem(,深色模式,this.darkMode,(value:boolean){this.darkModevalue;// 更新状态变量});这种模式的好处Builder 无状态它不知道也不关心状态如何变化调用者控制逻辑由使用方决定回调中做什么高度复用同一个 Builder 可以在不同场景使用六、本篇小结本篇我们实现了✅个人中心页面头像 统计卡片 功能菜单列表✅系统设置页面Toggle 开关 字体选择 分区布局✅AlertDialog 弹窗清除缓存确认交互✅Builder 回调模式实现 UI 与逻辑分离✅多状态变量管理6 个 State 协同工作下篇将是本系列的收官之作——编译调试、打包发布与常见问题总结涵盖清除缓存构建、HAP 打包、签名配置、模拟器/真机调试等实用内容。
鸿蒙Next实战开发(四):个人中心与系统设置页面开发
发布时间:2026/6/8 8:16:10
鸿蒙Next实战开发四个人中心与系统设置页面开发系列第四篇我们来实现智慧生活App的最后两个页面——个人中心和数据设置页。包含头像卡片、数据统计、功能菜单、Toggle开关、字体选择、AlertDialog弹窗等交互。一、页面概览本篇覆盖两个页面页面文件用途 个人中心Index.ets中ProfileContent用户信息、数据统计、功能入口⚙️ 系统设置SettingsPage.ets显示/通知/数据设置、关于信息二、个人中心模块个人中心是 Tabs 底部导航的第四个 Tab作为用户个人信息的聚合入口。2.1 整体布局┌─────────────────────────┐ │ │ ← 头像 │ HarmonyOS 开发者 │ ← 昵称 │ 探索智慧生活连接无限可能 │ ← 签名 ├──────┬──────┬──────────┤ │ │ ✅ │ │ ← 数据统计 │ 5 │ 6 │ 7天 │ │ 笔记 │ 待办 │ 连续 │ ├──────┴──────┴──────────┤ │ 功能设置 │ │ 深色模式 跟随系统 ›│ ← 菜单列表 │ 消息通知 已开启 ›│ │ 隐私设置 ›│ │ ⚙️ 系统设置 ›│ ← 可跳转 │ 使用帮助 ›│ │ ℹ️ 关于应用 v1.0.0 ›│ └─────────────────────────┘2.2 头像与个人信息使用 emoji 做轻量头像避免加载图片资源的复杂性// 头像Column(){Text().fontSize(52);}.width(80).height(80).backgroundColor(#FFE8F0FE).borderRadius(40).alignItems(HorizontalAlign.Center).justifyContent(FlexAlign.Center);Text(HarmonyOS 开发者).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Text(探索智慧生活连接无限可能).fontSize(14).fontColor($r(app.color.text_tertiary));2.3 数据统计三卡片通过Builder buildStatCard复用卡片样式BuilderbuildStatCard(icon:string,label:string,value:string){Column({space:6}){Text(icon).fontSize(24);Text(value).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Text(label).fontSize(12).fontColor($r(app.color.text_tertiary));}.layoutWeight(1).padding(16).backgroundColor($r(app.color.card_background)).borderRadius(16).shadow({radius:4,color:#0A000000,offsetY:1}).alignItems(HorizontalAlign.Center);}使用Row({space:12}){this.buildStatCard(,笔记,5);this.buildStatCard(✅,待办,6);this.buildStatCard(,连续,7天);}.width(100%).padding({left:16,right:16});2.4 功能菜单列表在 ArkTS 中我们可以编写多个Builder来处理不同类型的菜单项普通菜单项仅展示BuilderbuildMenuItem(icon:string,label:string,detail:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary));}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:8});}.width(100%).padding({top:14,bottom:14});}带路由跳转的菜单项BuilderbuildMenuLinkItem(icon:string,label:string,detail:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary));}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:8});}.width(100%).padding({top:14,bottom:14}).onClick((){router.pushUrl({url:pages/SettingsPage});});}为什么拆分两个 Builder因为 ArkTS 的Builder函数不支持条件判断路由跳转——如果点击事件需要区分不同行为要么拆分 Builder要么传入回调函数。使用方式Column({space:1}){this.buildMenuItem(,深色模式,跟随系统);this.buildMenuItem(,消息通知,已开启);this.buildMenuItem(,隐私设置,);this.buildMenuLinkItem(⚙️,系统设置,);this.buildMenuItem(,使用帮助,);this.buildMenuItem(ℹ️,关于应用,v1.0.0);}.width(100%).backgroundColor($r(app.color.card_background)).borderRadius(16).shadow({radius:4,color:#0A000000,offsetY:1}).padding({left:16,right:16});三、系统设置页面3.1 功能清单系统设置页是独立路由页面通过router.pushUrl跳转进入包含区域功能交互组件显示设置深色模式Toggle 开关显示设置字体大小小/中/大点击选择通知设置消息通知Toggle 开关通知设置声音提醒Toggle 开关通知设置震动反馈Toggle 开关数据存储自动同步Toggle 开关数据存储清除缓存AlertDialog 确认数据存储导出数据点击关于应用版本/构建版本/开源许可展示3.2 顶部导航栏Row(){Text(← 返回).fontSize(16).fontColor($r(app.color.primary_color)).onClick((){router.back();});Blank();Text(系统设置).fontSize(18).fontWeight(FontWeight.Bold).fontColor($r(app.color.text_primary));Blank();Row().width(50);// 占位保持对称}3.3 Toggle 开关组件鸿蒙的Toggle组件支持三种类型Switch、Checkbox、Button。构建可复用的开关行BuilderbuildToggleItem(icon:string,label:string,checked:boolean,onChange:(value:boolean)void){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);Toggle({type:ToggleType.Switch,isOn:checked}).onChange((value:boolean){onChange(value);});}.width(100%).padding({top:10,bottom:10});}使用this.buildToggleItem(,深色模式,this.darkMode,(value:boolean){this.darkModevalue;});this.buildToggleItem(,消息通知,this.notificationEnabled,(value:boolean){this.notificationEnabledvalue;});3.4 字体大小选择使用三个标签按钮实现单选效果BuilderbuildSizeOption(label:string,value:number){Text(label).fontSize(12).fontColor(this.fontSizevalue?Color.White:$r(app.color.text_primary)).backgroundColor(this.fontSizevalue?$r(app.color.primary_color):#FFF3F4F6).padding({left:12,right:12,top:4,bottom:4}).borderRadius(12).onClick((){this.fontSizevalue;});}使用Row({space:4}){this.buildSizeOption(小,0);this.buildSizeOption(中,1);this.buildSizeOption(大,2);}3.5 AlertDialog 确认弹窗当用户点击清除缓存时弹出确认对话框this.buildClickItem(️,清除缓存,12.5 MB,(){AlertDialog.show({title:清除缓存,message:确定要清除所有缓存数据吗,primaryButton:{value:取消,action:(){}},secondaryButton:{value:确定,action:(){// 执行清除操作}},cancel:(){}});});AlertDialog.show的参数配置参数类型说明titlestring弹窗标题messagestring弹窗内容primaryButtonobject主按钮左侧secondaryButtonobject次按钮右侧cancelfunction点击遮罩层或按返回键的回调3.6 可点击的菜单项BuilderbuildClickItem(icon:string,label:string,detail:string,onClick:()void){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);if(detail.length0){Text(detail).fontSize(14).fontColor($r(app.color.text_tertiary)).margin({right:8});}Text(›).fontSize(22).fontColor($r(app.color.text_tertiary)).margin({left:4});}.width(100%).padding({top:14,bottom:14}).onClick((){onClick();});}3.7 信息展示项BuilderbuildInfoItem(icon:string,label:string,value:string){Row(){Text(icon).fontSize(22);Text(label).fontSize(16).fontColor($r(app.color.text_primary)).margin({left:12}).layoutWeight(1);Text(value).fontSize(14).fontColor($r(app.color.text_tertiary));}.width(100%).padding({top:14,bottom:14});}3.8 分区布局设置页面按功能分区组织每个分区有标题和卡片容器// 显示设置Text(显示设置).fontSize(16).fontWeight(FontWeight.Medium);Column({space:0}){this.buildToggleItem(,深色模式,this.darkMode,...);this.buildDivider();// 字体大小行}.backgroundColor($r(app.color.card_background)).borderRadius(16).padding({left:16,right:16});// 分割线BuilderbuildDivider(){Row().width(100%).height(1).backgroundColor($r(app.color.divider_color));}每个分区间的Text标题 Column卡片容器 构成清晰的视觉分组。四、状态管理多个 State 变量协设置页有 6 个State变量管理不同的设置项StatedarkMode:booleanfalse;StatenotificationEnabled:booleantrue;StatesoundEnabled:booleantrue;StatevibrationEnabled:booleantrue;StateautoSync:booleanfalse;StatefontSize:number1;每个Toggle组件的onChange回调直接更新对应的State变量ArkUI 框架会自动追踪变化并触发重新渲染。这种模式称为“状态驱动UI”——开发者只管理状态UI 由框架自动更新。五、Builder 传回调函数模式本篇文章中多次使用了传入回调函数的 Builder 模式这是 ArkTS 中实现组件复用和交互分离的关键技巧// 定义接收 onChange 回调BuilderbuildToggleItem(icon:string,label:string,checked:boolean,onChange:(value:boolean)void// ← 回调函数类型){Toggle({type:ToggleType.Switch,isOn:checked}).onChange((value:boolean){onChange(value);});}// 使用传入具体的回调实现this.buildToggleItem(,深色模式,this.darkMode,(value:boolean){this.darkModevalue;// 更新状态变量});这种模式的好处Builder 无状态它不知道也不关心状态如何变化调用者控制逻辑由使用方决定回调中做什么高度复用同一个 Builder 可以在不同场景使用六、本篇小结本篇我们实现了✅个人中心页面头像 统计卡片 功能菜单列表✅系统设置页面Toggle 开关 字体选择 分区布局✅AlertDialog 弹窗清除缓存确认交互✅Builder 回调模式实现 UI 与逻辑分离✅多状态变量管理6 个 State 协同工作下篇将是本系列的收官之作——编译调试、打包发布与常见问题总结涵盖清除缓存构建、HAP 打包、签名配置、模拟器/真机调试等实用内容。