鸿蒙 ArkTS 实战:Focus White Noise 从专注白噪音到个人成长工具完整解析
鸿蒙 ArkTS 实战:Focus White Noise 从专注白噪音到个人成长工具完整解析
前言
Focus White Noise 是一个基于鸿蒙 ArkTS 的个人成长类单页应用,主题围绕声音选择、专注分钟、专注次数、开始记录和时长调整展开。它把习惯、目标、复盘、情绪或专注这类抽象事项,落成可输入、可点击、可反馈的界面。
本文直接根据项目Index.ets源码展开,分析它如何设计状态字段、如何绑定输入组件、如何通过按钮触发业务逻辑,以及如何用指标和文案给用户即时反馈。
个人成长工具最怕空泛。真正有用的体验通常很小:记录一次、推进一点、看到一个清晰结果。
配图可作为文章首屏示意。正式发布时可以替换为项目真机截图,突出标题、输入区、指标区和反馈区。
一、项目定位与业务价值
1.1 应用定位
用户选择雨声、森林或咖啡馆声音,调整专注时长后开始一次专注块,并累计次数。
这个项目适合做成轻量工具,因为它的核心目标不是复杂功能,而是帮助用户把一个行动持续记录下来。
1.2 价值拆解
| 价值 | 说明 | 页面体现 |
|---|---|---|
| 快速记录 | 降低输入成本 | TextInput |
| 即时反馈 | 点击后状态马上变化 | Button |
| 可视化结果 | 用数字或卡片表达进展 | Sessions / Minutes |
| 持续复盘 | 形成下一步计划 | 反馈文案 |
二、源码入口与页面结构
2.1 入口组件
项目采用 ArkTS 标准组件声明。
@Entry@Componentstruct Index{build(){// page content}}2.2 页面组成
页面通常由以下区域组成:
- 标题区:展示
Focus White Noise。 - 输入区:填写目标、习惯、情绪、计划或任务。
- 指标区:展示
Sessions / Minutes。 - 按钮区:执行打卡、复盘、保存、完成等动作。
- 反馈区:告诉用户本次操作结果。
三、状态模型抽象
3.1 模型定义
从源码可以抽象出FocusNoiseState。
typeFocusNoiseState={title:string;value:string|number;note:string;updated:boolean;};3.2 实际状态代码
项目真实状态如下。
@Statesound:string='Rain';@Stateminutes:number=25;@Statesessions:number=14;@Statereport:string='Pick a sound and start a focus block.';3.3 状态职责
| 状态 | 类型 | 职责 |
|---|---|---|
sound | 状态字段 | 支撑专注白噪音的输入、指标或反馈 |
minutes | 状态字段 | 支撑专注白噪音的输入、指标或反馈 |
sessions | 状态字段 | 支撑专注白噪音的输入、指标或反馈 |
report | 状态字段 | 支撑专注白噪音的输入、指标或反馈 |
这些状态字段全部服务于页面上的真实信息,不会让代码显得松散。
四、默认数据与首屏体验
4.1 默认内容
| 默认项 | 字段 | 含义 |
|---|---|---|
| Rain | sound | 默认声音 |
| 25 | minutes | 默认专注分钟 |
4.2 默认值意义
默认值让用户进入页面后立刻知道工具用途。个人成长工具如果首屏空白,很容易让用户无从下手。
- 默认文本给出填写样例。
- 默认指标展示当前进展。
- 默认反馈解释下一步动作。
五、核心业务函数
5.1 主函数
项目核心业务逻辑如下。
start():void{this.sessions++;this.report=this.sound+' focus started for '+this.minutes+' minutes.';}5.2 操作流程
- 选择白噪音
- 调整专注时长
- 开始专注块
- 累计专注次数
这条流程形成了输入、行动、反馈的闭环,是页面最重要的用户路径。
六、辅助动作与展示
6.1 辅助代码
项目还包含辅助动作或布局展示。
Button('-5').onClick(()=>this.minutes=Math.max(5,this.minutes-5))Button('+5').onClick(()=>this.minutes+=5)6.2 辅助动作价值
| 类型 | 作用 | 示例 |
|---|---|---|
| 提醒 | 帮用户坚持 | 习惯提醒 |
| 卡片 | 让目标更可见 | 目标墙、日历 |
| 复盘 | 总结当前状态 | 周复盘、月回顾 |
| 调整 | 修改分数或时长 | 情绪、专注分钟 |
七、输入组件设计
7.1 TextInput 绑定
输入框直接把用户输入同步到状态。
TextInput({text:this.sound,placeholder:'Input value'}).onChange((value:string)=>this.sound=value)7.2 输入内容特点
个人成长类工具的输入多为自然语言,例如目标、问题、清单、愿望、计划。它们不一定需要复杂校验,但需要即时保存和明确反馈。
八、指标展示策略
8.1 核心指标
页面核心指标是Sessions / Minutes。
Text('Sessions / Minutes '+value).fontSize(24).fontWeight(FontWeight.Bold)8.2 指标类型
| 类型 | 示例 | 作用 |
|---|---|---|
| 连续天数 | streak | 强化坚持 |
| 百分比 | progress、completion | 表达进度 |
| 等级 | level | 体现成长 |
| 次数 | works、sessions、done | 记录积累 |
九、反馈文案设计
9.1 文案更新
反馈文案通过状态更新。
this.status='Action completed.';this.summary='Review generated.';9.2 文案原则
| 原则 | 说明 |
|---|---|
| 具体 | 包含当前目标或行动 |
| 简短 | 适合移动端阅读 |
| 正向 | 强化下一步行动 |
| 可复盘 | 能在之后读懂当时发生了什么 |
十、布局与视觉层次
10.1 容器结构
部分页面使用Scroll + Column,部分页面使用左右分栏或顶部沉浸区。
Scroll(){Column({space:16}){Text('Focus White Noise')// input// metric// action// feedback}}10.2 视觉组织
| 层级 | 内容 | 目的 |
|---|---|---|
| 标题 | 应用名称 | 明确场景 |
| 指标 | 进度或数量 | 建立动力 |
| 输入 | 当前目标或记录 | 承接内容 |
| 按钮 | 完成动作 | 推动变化 |
| 文案 | 本次结果 | 形成记忆 |
十一、运行验证流程
11.1 手工验证
可以按下面流程验证:
- 打开页面,确认标题为
Focus White Noise。 - 检查默认内容是否存在。
- 修改第一个输入框。
- 点击主按钮。
- 观察指标或反馈文案是否变化。
// 手工验证伪代码constbefore='default growth state';constaction='tap primary button';constafter='metric and message updated';console.info(before+' -> '+action+' -> '+after);11.2 验证重点
| 验证点 | 预期 |
|---|---|
| 输入同步 | 状态跟随输入 |
| 按钮触发 | 业务函数执行 |
| 指标变化 | 数字或进度更新 |
| 文案变化 | 结果明确 |
| 多次点击 | 累计逻辑合理 |
十二、边界情况处理
12.1 数值边界
涉及分值、等级、完成度、分钟时,要控制上下限。
constsafeLevel=Math.min(10,Math.max(1,level));constsafeMood=Math.max(1,Math.min(10,mood));12.2 业务边界
| 场景 | 风险 | 处理方向 |
|---|---|---|
| 情绪分数越界 | 数据不可信 | 限制 1 到 10 |
| 目标进度超过 100 | 结果异常 | 使用Math.min |
| 专注分钟过低 | 无法形成任务 | 设置最小 5 分钟 |
| 愿望时间线过长 | 文案拥挤 | 后续转列表 |
| 热力图字符串过长 | 可视化困难 | 后续转数组模型 |
十三、扩展为完整应用
13.1 业务扩展
后续可以加入真实音频、倒计时、专注统计、场景预设和番茄钟模式。
13.2 工程抽象
可以抽象统一成长记录对象。
interfaceGrowthRecord{title:string;metric:number;note:string;createdAt:number;}functioncreateGrowthRecord(title:string,metric:number,note:string):GrowthRecord{return{title,metric,note,createdAt:Date.now()};}十四、维护与优化
14.1 状态集中
当前项目体量适合把状态放在页面组件内。未来增加历史记录后,可以拆成数据层。
14.2 文案复用
反馈文案最好逐步统一,便于后续做导出、分享或多语言。
functionbuildFeedback(action:string,target:string):string{returnaction+': '+target;}14.3 数据持久化
成长类工具非常依赖历史。后续可以优先保存时间戳、标题、指标和备注。
十五、工程复盘
15.1 当前实现亮点
- 状态字段贴合个人成长场景。
- 页面动作短,反馈及时。
- 指标清晰,能形成激励。
- 代码结构适合继续扩展。
- 适合作为 ArkTS 状态管理练习。
15.2 可复用经验
Focus White Noise的实现思路可以复用到习惯、复盘、目标、愿望、专注、技能成长等多个场景。核心都是把“抽象目标”变成“可点击的具体行动”。
总结
Focus White Noise用鸿蒙 ArkTS 实现了一个围绕专注白噪音的个人成长工具。它通过@State保存用户输入和进度,通过按钮触发核心动作,再用指标和反馈文案把结果展示出来。
从工程角度看,这个项目已经完成了单页工具的核心闭环。后续继续加入历史记录、提醒通知、图表统计或本地持久化,都可以在当前结构上自然扩展。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
补充说明:当前页面把个人成长动作拆成了输入、指标和反馈三个稳定部分。
补充说明:指标展示能让用户看到持续行动带来的变化。
补充说明:反馈文案承担了复盘作用,后续可以成为历史记录的一部分。
补充说明:如果加入持久化,建议优先保存标题、指标、备注和时间戳。
相关资源:
- HarmonyOS 开发者官网
- ArkTS 语言基础
- ArkUI 组件开发