鸿蒙 ArkTS 实战:Family Truth Cards 从家庭真心话卡片到成绩记录完整解析
鸿蒙 ArkTS 实战Family Truth Cards 从家庭真心话卡片到成绩记录完整解析前言Family Truth Cards 是一个面向家庭真心话卡片的鸿蒙 ArkTS 单页应用。项目代码集中在Index.ets通过State管理记录列表、输入内容、声音开关和状态提示并用ForEach把每一轮记录渲染为可勾选列表。这篇文章直接基于项目源码展开不写空泛介绍重点分析它的数据模型、默认记录、统计函数、表单提交、列表刷新和后续扩展方式。对于学习 ArkTS 单页应用的人来说这类项目很适合用来理解状态驱动 UI 的基本路径。轻量小游戏或训练工具不一定先做复杂玩法。先把记录、统计、反馈和列表交互搭起来后续接入真正的游戏逻辑会更稳。配图展示的是开发者生态入口发布时也可以替换成应用运行截图。本文关注的结构是顶部指标、功能标签、声音开关、录入表单和记录列表。一、项目定位与源码入口1.1 应用定位面向家庭互动场景用问题分类、随机抽取、跳过规则和收藏问题管理每轮卡片体验。当前页面不是复杂多页应用而是一个清晰的单页面闭环用户看到默认记录输入新的轮次信息点击按钮保存再通过列表勾选需要关注的记录。1.2 源码入口核心文件位于entry/src/main/ets/pages/Index.ets入口组件使用Entry与Component标记。EntryComponentstruct Index{build(){Scroll(){Column({space:14}){Text(Family Truth Cards)}}}}区域作用对应能力标题呈现应用名称Family Truth Cards统计卡片展示Cards与 Selected汇总与计数标签区展示玩法模块Question category, Random draw, Skip rule, Saved question表单新增记录TextInput、Button列表管理记录状态ForEach、Toggle二、数据模型设计2.1 记录接口项目使用GameRound描述每一条游戏记录。interfaceGameRound{title:string;score:number;note:string;active:boolean;}这个接口非常适合成绩类应用。title表示轮次或关卡score保存卡片数量note用来保存补充描述active则控制是否被选中。2.2 字段语义字段类型在本项目中的含义titlestring轮次、关卡或分类名称scorenumber卡片数量notestring结果说明、提示状态或扩展备注activeboolean是否作为重点记录数据模型稳定是这类项目的关键。后续即使增加真实玩法也可以继续把最终结果写回同一个记录结构。三、默认数据与业务语义3.1 默认记录页面初始化时已经准备两条业务记录。Staterounds:GameRound[][{title:Warmup questions,score:6,note:Skip rule 2,active:false},{title:Memory questions,score:4,note:Saved favorite,active:false}];默认标题数值备注是否选中Warmup questions6Skip rule 2falseMemory questions4Saved favoritefalse3.2 默认数据的价值默认数据让用户首次进入页面时就能理解这个应用要记录什么。比如Warmup questions和Memory questions分别对应不同训练或玩法场景备注字段则补充了结果细节。空列表会降低理解效率。示例记录可以说明输入格式。顶部统计从首次打开就有可读数值。四、页面状态管理4.1 状态字段页面使用State保存列表、表单、开关和提示文本。Staterounds:GameRound[][];StatetitleText:string;StatescoreText:string;StatenoteText:string;StatesoundOn:booleantrue;Statestatus:stringGame ready;4.2 状态流转状态触发动作结果rounds新增或勾选记录列表和统计刷新titleText输入轮次名称提交时写入 titlescoreText输入数值转换为 scorenoteText输入备注写入 notesoundOn切换声音开关保存声音偏好status提交表单展示错误或成功信息ArkTS 的声明式体验重点在于状态变化。只要状态设计清楚UI 更新就能自然跟随数据变化。五、统计函数拆解5.1 累计Cards顶部左侧指标来自totalScore()。privatetotalScore():number{lettotal0;this.rounds.forEach((item:GameRound){totalitem.score;});returntotal;}5.2 计算选中数量右侧 Selected 来自selectedCount()。privateselectedCount():number{letcount0;this.rounds.forEach((item:GameRound){if(item.active){count;}});returncount;}这两个函数都只读列表状态不修改任何数据因此适合作为 UI 层的派生计算。六、顶部指标卡片实现6.1 卡片代码顶部区域使用两个Column并排展示核心指标。Row({space:10}){Column({space:4}){Text(Cards).fontSize(13).fontColor(#475569)Text(String(this.totalScore())).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#DC2626)}.layoutWeight(1).padding(14).backgroundColor(#FEE2E2).borderRadius(8)Column({space:4}){Text(Selected).fontSize(13).fontColor(#475569)Text(this.selectedCount()/this.rounds.length).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#1D4ED8)}.layoutWeight(1).padding(14).backgroundColor(#DBEAFE).borderRadius(8)}6.2 指标解释指标数据来源产品含义Cards所有记录的 score 汇总衡量整体表现Selectedactive 为 true 的记录数量标记当前关注记录总数rounds.length展示记录规模对于家庭真心话卡片卡片数量是最重要的结果数据因此放在左侧主卡片。七、功能标签区域7.1 标签渲染页面用四个短标签概括玩法能力。Column({space:8}){Row({space:8}){Text(Question category).layoutWeight(1).fontSize(13).textAlign(TextAlign.Center)Text(Random draw).layoutWeight(1).fontSize(13).textAlign(TextAlign.Center)}Row({space:8}){Text(Skip rule).layoutWeight(1).fontSize(13).textAlign(TextAlign.Center)Text(Saved question).layoutWeight(1).fontSize(13).textAlign(TextAlign.Center)}}7.2 标签含义序号标签说明1Question category主玩法入口2Random draw交互过程3Skip rule结果反馈4Saved question沉淀能力功能标签的好处是信息密度高不需要额外说明文字也能让用户迅速理解页面能力。八、声音开关与配置入口8.1 开关代码页面提供Sound开关状态保存在soundOn中。Row(){Text(Sound).fontSize(16).fontColor(#374151)Blank()Toggle({type:ToggleType.Switch,isOn:this.soundOn}).onChange((checked:boolean)this.soundOnchecked)}8.2 扩展方向在当前版本中soundOn还没有接入音频系统但它已经占好了配置位置。后续可以根据它控制按钮音效、答题反馈音、成功提示音或错误提醒音。九、表单录入与校验9.1 输入区结构表单由名称、数值、备注和按钮组成。Column({space:10}){TextInput({placeholder:Round name,text:this.titleText}).onChange((value:string)this.titleTextvalue)TextInput({placeholder:Score,text:this.scoreText}).type(InputType.Number).onChange((value:string)this.scoreTextvalue)TextInput({placeholder:Note,text:this.noteText}).onChange((value:string)this.noteTextvalue)Button(Add score).height(42).width(100%).onClick(()this.addRound())}9.2 校验规则提交时会先检查名称和数值。名称不能为空分数必须能转换成有效数字。constscoreNumber(this.scoreText);if(this.titleText.trim().length0||!Number.isFinite(score)){this.statusEnter round and valid score;return;}这个校验足够直接能避免空标题和非法分数进入列表。十、新增记录逻辑10.1 保存方法新增记录由addRound()完成。privateaddRound():void{constscoreNumber(this.scoreText);if(this.titleText.trim().length0||!Number.isFinite(score)){this.statusEnter round and valid score;return;}this.rounds[{title:this.titleText,score:Math.round(score),note:this.noteText.length0?this.noteText:No note yet,active:false},...this.rounds];this.titleText;this.scoreText;this.noteText;this.statusRound saved;}10.2 头部插入新记录会插入到数组头部。这样用户提交后最新数据立即出现在第一条反馈路径很短。十一、列表渲染与选中态11.1 ForEach 渲染列表渲染使用ForEach遍历rounds。ForEach(this.rounds,(item:GameRound,index:number){Row(){Toggle({type:ToggleType.Checkbox,isOn:item.active}).onChange(()this.toggleActive(index))Column({space:6}){Text(item.title).fontSize(18).fontWeight(FontWeight.Bold)Text(item.note).fontSize(14).fontColor(#475569)}.layoutWeight(1).margin({left:8})Text(String(item.score)).fontSize(18).fontWeight(FontWeight.Bold).fontColor(#DC2626)}.padding(14).backgroundColor(item.active?#DCFCE7:#FFFFFF).borderRadius(8)})11.2 勾选更新切换勾选时先修改当前项再用展开语法生成新数组引用。privatetoggleActive(index:number):void{this.rounds[index].active!this.rounds[index].active;this.rounds[...this.rounds];}这个写法保证列表 UI 能感知状态变化。选中的记录会使用#DCFCE7背景色视觉反馈明确。十二、布局与视觉层次12.1 页面容器外层使用Scroll内部使用Column。Scroll(){Column({space:14}){Text(Family Truth Cards)// stats// tags// sound switch// form// list}.padding(18).width(100%)}.height(100%).backgroundColor(#F8FAFC)12.2 配色表颜色使用位置作用#F8FAFC页面背景保持浅色基底#DC2626主指标数值强调成绩#1D4ED8Selected 数值强调选择状态#DCFCE7选中列表项表达活跃状态#F1F5F9表单背景区分输入区域十三、运行验证流程13.1 手工验证路径可以按以下流程验证打开页面确认标题是Family Truth Cards。查看默认两条记录是否出现。点击Add score且不输入内容确认提示为Enter round and valid score。输入Daily round、99和备注再点击保存。勾选新记录确认背景变绿且 Selected 数量增加。this.titleTextDaily round;this.scoreText99;this.noteTextManual record;this.addRound();// 预期status 更新为 Round saved// 预期新记录位于列表第一项13.2 验证要点验证点预期结果空标题提交显示错误提示合法提交新记录插入列表顶部数值输入保存为整数 score勾选记录active 取反顶部统计跟随列表变化十四、面向真实玩法的扩展14.1 业务扩展后续可以加入问题库、随机抽卡动画、跳过次数限制、收藏列表和多人轮换。14.2 工程扩展后续扩展时可以保持当前页面的状态结构不变只把真实玩法结果接入score和noteinterfacePlayResult{roundTitle:string;finalScore:number;summary:string;}functionmapResultToRound(result:PlayResult):GameRound{return{title:result.roundTitle,score:result.finalScore,note:result.summary,active:false};}这样可以把玩法层和记录层分开避免页面代码随着功能增加而失控。十五、工程复盘15.1 当前实现的优点数据结构简单字段语义清楚。统计函数只依赖列表数据逻辑可预测。表单校验直接错误提示明确。列表更新使用新数组引用刷新路径稳定。功能标签贴合家庭真心话卡片的业务方向。15.2 可复用经验这类结构可以复用到答题、训练、学习、聚会游戏、儿童教育和轻量工具中。只要业务结果可以表达为“标题 数值 备注 状态”就能套入相同的记录管理骨架。总结Family Truth Cards展示了一个完整的鸿蒙 ArkTS 小应用骨架用GameRound定义记录用rounds保存列表用totalScore()和selectedCount()输出统计结果用addRound()完成表单提交再用ForEach和Toggle完成记录展示与选中状态更新。它的代码不复杂但工程链路完整。对于家庭真心话卡片这种玩法来说当前版本已经完成了成绩记录层后续只需要逐步补齐真实玩法就能从原型平滑走向可用产品。补充说明当前页面把业务状态集中在组件内适合小型训练工具快速迭代。补充说明记录列表采用头部插入能让用户提交后立即看到最新结果。补充说明备注字段保留了足够弹性可以承载提示、收藏、错误次数或扩展状态。补充说明统计卡片和列表项共享同一份数据减少了重复状态带来的不一致风险。补充说明当前页面把业务状态集中在组件内适合小型训练工具快速迭代。补充说明记录列表采用头部插入能让用户提交后立即看到最新结果。补充说明备注字段保留了足够弹性可以承载提示、收藏、错误次数或扩展状态。补充说明统计卡片和列表项共享同一份数据减少了重复状态带来的不一致风险。相关资源HarmonyOS 开发者官网ArkTS 语言基础ArkUI 组件开发状态管理概览TextInput 组件

相关新闻

RadialGradient 径向光晕:大日期数字的视觉增强

RadialGradient 径向光晕:大日期数字的视觉增强

前言 在 UI 设计中,光晕效果可以为元素添加视觉点缀,增强层次感和品牌调性。HarmonyOS 提供了 RadialGradient 径向渐变 API,用于创建从中心向四周扩散的渐变效果。 “海风日记“的首页通过 RadialGradient 为日期数字添加了径向光晕&#…

2026/9/28 11:30:03 阅读更多 →
HSPICE 仿真中十进制转二进制方法——简化多 bit 信号设置

HSPICE 仿真中十进制转二进制方法——简化多 bit 信号设置

在使用 HSPICE 进行仿真时,常需设置多 bit 信号。若逐 bit 单独设置,当位数较多时操作繁琐,且修改输入值耗时费力。本文介绍一种通过十进制转二进制的方法,只需改变十进制变量的赋值,即可自动设置对应的二进制信号&…

2026/9/25 12:49:19 阅读更多 →
Flutter MaterialApp核心配置与最佳实践指南

Flutter MaterialApp核心配置与最佳实践指南

1. MaterialApp:Flutter应用的基础骨架MaterialApp是Flutter应用开发的起点,就像建造房屋时需要先打好地基。这个Widget为应用提供了Material Design风格的基本框架结构,包含了主题、路由、本地化等核心功能模块。在实际项目中,几…

2026/9/20 17:10:03 阅读更多 →

最新新闻

昆明理工大学计算机考研复试分数线预测:B区国家线趋势与备考策略

昆明理工大学计算机考研复试分数线预测:B区国家线趋势与备考策略

报考昆明理工大学计算机类硕士的同学,最近最关心的应该就是复试分数线了。2026年考研初试已经结束,网上各种预测满天飞,但很多帖子只丢一个数字,不讲依据,看着心里没底。这篇预测版我不打算只给结论,而是把…

2026/9/29 17:42:42 阅读更多 →
JS逆向通杀模版:破解创宇盾(加速乐)动态JS防护全流程

JS逆向通杀模版:破解创宇盾(加速乐)动态JS防护全流程

做JS逆向的兄弟应该都有印象,第一次碰到创宇盾(加速乐)防护的站点时是什么感觉:请求发过去,返回的不是正常数据,而是状态码521或一段HTML,里面夹着巨长的混淆JS,文件名还带时间戳。那…

2026/9/29 17:42:42 阅读更多 →
团队共享CLAUDE.md:统一AI编程协作与代码风格

团队共享CLAUDE.md:统一AI编程协作与代码风格

把CLAUDE.md纳入版本管理,是我这个“AI编程技巧”系列里踩坑最多、收益也最大的一步。事情的起因很普通:我带的小组四个人都在用Claude Code写同一个数据分析平台,按理说工具一样、模型一样,生成的代码应该差不多。结果一提交PR&a…

2026/9/29 17:42:42 阅读更多 →
TBOX软件设计实战:状态机驱动的车联网通信网关架构

TBOX软件设计实战:状态机驱动的车联网通信网关架构

做TBOX软件设计这几年,我最大的感受是:这玩意儿看起来就是一块盒子,跑点通信逻辑,但真正上手才发现,它夹在整车和云平台之间,既要懂CAN总线,又要懂MQTT/TCP/IP,还得处理电源管理、远…

2026/9/29 17:42:42 阅读更多 →
基于ESP32-C3与立创EDA的半导体制冷杯PWM驱动与OLED交互设计

基于ESP32-C3与立创EDA的半导体制冷杯PWM驱动与OLED交互设计

1. 从一杯冰水说起:这个项目到底在做什么夏天喝温水这件事,说大不大,说小也不小。办公室里空调开着,一杯水放半小时就温吞吞的,想喝口凉的要么去冰箱拿,要么加冰块,要么干脆忍了。市面上确实有制…

2026/9/29 17:42:42 阅读更多 →
园区微电网风光储协同规划:从独立运营到联合优化建模实战

园区微电网风光储协同规划:从独立运营到联合优化建模实战

1. 从独立运营到联合优化:这项目到底在解什么问题园区微电网的规划和调度,这几年在工程圈和数学建模圈都特别火。你随便翻一篇关于新能源消纳、零碳园区、需求响应的论文,十篇里有八篇绕不开“风光储”这三个字。而实际做项目的时候&#xff…

2026/9/29 17:41:42 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →