新闻详情

新闻详情

首页 / 资讯中心 / 详情

及时做APP开发实战(七)-专注时长实时累加实现

发布时间:2026/9/4 19:04:13来源:尧图网络
及时做APP开发实战(七)-专注时长实时累加实现
及时做APP开发实战(七)-专注时长实时累加实现本文将详细介绍番茄钟专注时长的实时累加实现让用户能够实时看到专注成果的积累。一、问题背景1.1 问题现象在番茄钟应用中用户希望实时看到专注时长的累加而不是等到番茄钟完成才更新。原实现存在以下问题┌─────────────────────────────────────┐ │ 问题现象示意 │ ├─────────────────────────────────────┤ │ 专注10分钟 → 显示0分钟未完成 │ │ 提前结束 → 专注时长丢失 │ │ 用户无法实时看到专注成果 │ └─────────────────────────────────────┘1.2 问题分析原代码只在番茄钟完成时一次性累加// 问题代码只在完成时累加timerIdsetInterval((){if(this.timeLeft0){this.timeLeft--;// 只减少剩余时间}else{this.onTimerComplete();}},1000);// 完成时一次性累加onTimerComplete(){this.totalFocusMinutesthis.customDuration;}问题根源专注时长totalFocusMinutes只在完成时更新无法实时反映用户的专注进度提前结束时专注时长丢失二、解决方案2.1 核心思路┌─────────────────────────────────────┐ │ 解决思路 │ ├─────────────────────────────────────┤ │ 1. 新增变量记录当前番茄钟秒数进度 │ │ 2. 每秒累加满60秒更新一次专注时长 │ │ 3. 完成时处理不足60秒的部分 │ │ 4. 区分专注时间和休息时间 │ └─────────────────────────────────────┘2.2 变量设计┌─────────────────────────────────────┐ │ 双变量设计 │ ├─────────────────────────────────────┤ │ totalFocusMinutes 总专注时长 │ │ State用于UI显示 │ │ │ │ currentFocusSeconds 当前秒数进度 │ │ private用于累加计算 │ └─────────────────────────────────────┘2.3 代码实现EntryComponentstruct PomodoroTimer{StatetotalFocusMinutes:number0;// 总专注时长分钟privatecurrentFocusSeconds:number0;// 当前番茄钟已专注秒数StateisBreak:booleanfalse;// 是否休息时间StatetimeLeft:number25*60;StateisRunning:booleanfalse;privatetimerId:number-1;// 开始计时startTimer(){if(this.isRunning)return;this.isRunningtrue;this.timerIdsetInterval((){if(this.timeLeft0){this.timeLeft--;// 实时累加专注时长仅在专注时间非休息时间if(!this.isBreak){this.currentFocusSeconds;// 每满60秒增加1分钟专注时长if(this.currentFocusSeconds60){this.totalFocusMinutes;this.currentFocusSeconds0;}}}else{this.onTimerComplete();}},1000);}// 计时完成onTimerComplete(){clearInterval(this.timerId);this.isRunningfalse;// 处理最后不足60秒的专注时间if(this.currentFocusSeconds0){// 四舍五入超过30秒算1分钟if(this.currentFocusSeconds30){this.totalFocusMinutes;}this.currentFocusSeconds0;}}// 重置计时器resetTimer(){clearInterval(this.timerId);this.isRunningfalse;this.currentFocusSeconds0;// 重置专注秒数this.timeLeft25*60;}}更改后结果图倒计时减少一分钟专注计时增加一分钟三、关键设计点3.1 休息时间判断if(!this.isBreak){// 仅在专注时间累加休息时间不累加this.currentFocusSeconds;}这样可以确保专注时间累加专注时长休息时间不累加专注时长3.2 不足1分钟的处理采用四舍五入策略┌─────────────────────────────────────┐ │ 四舍五入策略 │ ├─────────────────────────────────────┤ │ 专注45秒 → 超过30秒 → 算作1分钟 │ │ 专注20秒 → 不足30秒 → 忽略 │ └─────────────────────────────────────┘if(this.currentFocusSeconds30){this.totalFocusMinutes;}3.3 完整UI示例EntryComponentstruct FocusTimerPage{StatetimeLeft:number25*60;StatetotalFocusMinutes:number0;StateisRunning:booleanfalse;StateisBreak:booleanfalse;privatecurrentFocusSeconds:number0;privatetimerId:number-1;build(){Column(){// 显示总专注时长Row(){Text(今日专注).fontSize(14).fontColor(#666666)Text(${this.totalFocusMinutes}分钟).fontSize(24).fontWeight(FontWeight.Bold).fontColor(#FF6B6B)}.margin({bottom:20})// 进度条Progress({value:this.getProgress(),total:100,type:ProgressType.Ring}).width(200).height(200).color(this.isBreak?#4CAF50:#FF6B6B)// 时间显示Text(this.formatTime(this.timeLeft)).fontSize(48).fontWeight(FontWeight.Bold).margin({top:20})// 当前进度调试用Text(当前进度${this.currentFocusSeconds}秒).fontSize(14).fontColor(#999999).margin({top:10})// 控制按钮Row(){Button(this.isRunning?暂停:开始).backgroundColor(#FF6B6B).fontColor(Color.White).onClick(()this.toggleTimer())Button(重置).backgroundColor(#E0E0E0).fontColor(#333333).onClick(()this.resetTimer()).margin({left:20})}.margin({top:30})}.width(100%).height(100%).justifyContent(FlexAlign.Center)}getProgress():number{consttotalTime25*60;return((totalTime-this.timeLeft)/totalTime)*100;}formatTime(seconds:number):string{constminsMath.floor(seconds/60);constsecsseconds%60;return${mins.toString().padStart(2,0)}:${secs.toString().padStart(2,0)};}toggleTimer(){if(this.isRunning){clearInterval(this.timerId);this.isRunningfalse;}else{this.startTimer();}}startTimer(){this.isRunningtrue;this.timerIdsetInterval((){if(this.timeLeft0){this.timeLeft--;if(!this.isBreak){this.currentFocusSeconds;if(this.currentFocusSeconds60){this.totalFocusMinutes;this.currentFocusSeconds0;}}}else{this.complete();}},1000);}complete(){clearInterval(this.timerId);this.isRunningfalse;if(this.currentFocusSeconds30){this.totalFocusMinutes;}this.currentFocusSeconds0;}resetTimer(){clearInterval(this.timerId);this.isRunningfalse;this.currentFocusSeconds0;this.timeLeft25*60;}}四、效果对比4.1 功能验证场景修改前修改后专注10分钟显示0分钟显示10分钟 ✅专注25分钟完成显示25分钟显示25分钟 ✅提前结束显示0分钟显示实际时长 ✅休息时间也会累加不累加 ✅4.2 数据流示意┌─────────────────────────────────────┐ │ 实时累加流程 │ ├─────────────────────────────────────┤ │ 每秒触发 → currentFocusSeconds │ │ ↓ │ │ 满60秒? → totalFocusMinutes │ │ → currentFocusSeconds 0 │ │ ↓ │ │ 完成/重置 → 处理剩余秒数 │ └─────────────────────────────────────┘五、最佳实践5.1 变量设计原则// ✅ 正确分离显示变量和计算变量StatetotalFocusMinutes:number0;// 显示用privatecurrentFocusSeconds:number0;// 计算用// ❌ 错误只用一个变量无法精确控制StatefocusSeconds:number0;5.2 边界条件处理// ✅ 正确处理不足单位时间的情况if(this.currentFocusSeconds30){this.totalFocusMinutes;}// ❌ 错误忽略剩余时间// 直接清零丢失最后几十秒的专注成果5.3 状态区分// ✅ 正确区分专注和休息if(!this.isBreak){this.currentFocusSeconds;}// ❌ 错误不区分状态this.currentFocusSeconds;// 休息时间也会累加六、总结本文实现了专注时长的实时累加功能核心是采用双变量设计totalFocusMinutes用于UI显示的总时长currentFocusSeconds用于累加计算的秒数进度同时需要注意处理边界条件不足1分钟的部分和区分不同状态专注/休息这样才能为用户提供准确的实时反馈。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

KswordARK:Linux内核级诊断工具,解决内存泄漏与Rootkit检测难题 2026/9/4 19:04:06

KswordARK:Linux内核级诊断工具,解决内存泄漏与Rootkit检测难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
MATLAB ADC行为级建模:从芯片手册到系统性能预测的工程实践 2026/9/4 19:04:06

MATLAB ADC行为级建模:从芯片手册到系统性能预测的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
防御ContextLeak:Agent工具描述注入与运行时上下文泄露防护 2026/9/4 19:04:06

防御ContextLeak:Agent工具描述注入与运行时上下文泄露防护

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
【AI大模型】流式输出:实现打字机效果的接口开发方法 2026/9/4 19:04:06

【AI大模型】流式输出:实现打字机效果的接口开发方法

【AI大模型】流式输出:实现打字机效果的接口开发方法(含完整代码) 在AI大模型工程化落地中,普通一次性返回的阻塞式接口,存在响应等待久、用户体验差、长文本卡死、前端交互僵硬等问题。用户提问后需要等待数秒甚至十几秒才能看到完整回答,极易误以为服务卡顿、程序卡死…

阅读更多 →
从笔记到收藏,碎片信息时代你需要的网络信息管理工具(含3款收藏工具推荐) 2026/9/4 19:04:06

从笔记到收藏,碎片信息时代你需要的网络信息管理工具(含3款收藏工具推荐)

近10年来,我们每个人都面临着巨大的挑战,接收信息的规模已经达到了前所未有的高度。这样的环境,对我们每个人的信息处理能力都提出了更高的要求。在面临各种类型,各种来源的信息时,笔记软件横空出世,承担了…

阅读更多 →
I/O设备:输入输出的那些事儿 2026/9/4 19:01:06

I/O设备:输入输出的那些事儿

I/O设备:输入输出的那些事儿 计算机不能只算不看不听不说——它需要和外部世界交互。这就是**输入/输出设备(I/O设备)**的职责。 今天我们系统梳理一下计算机的各种I/O设备,以及它们是怎么和计算机配合工作的。 I/O设备的分类 输入设备 把外部信息"送进"计算…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞