news 2026/4/16 21:50:09

Flutter for OpenHarmony 实战_喝水提醒应用数据持久化与定时任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter for OpenHarmony 实战_喝水提醒应用数据持久化与定时任务

Flutter for OpenHarmony 实战:喝水提醒应用数据持久化与定时任务

文章目录

  • Flutter for OpenHarmony 实战:喝水提醒应用数据持久化与定时任务
    • 前言
    • 一、数据持久化系统
      • 1.1 SharedPreferences集成
      • 1.2 数据保存
      • 1.3 数据加载
    • 二、定时提醒系统
      • 2.1 Timer.periodic使用
      • 2.2 提醒显示
      • 2.3 定时器管理
    • 三、饮水记录管理
      • 3.1 记录数据结构
      • 3.2 添加记录
      • 3.3 记录显示
    • 四、UI界面设计
      • 4.1 进度显示
      • 4.2 快捷按钮
      • 4.3 统计信息
    • 五、状态管理
      • 5.1 状态变量
      • 5.2 setState更新
    • 六、用户体验优化
      • 6.1 即时反馈
      • 6.2 持久化保证
      • 6.3 友好提示
    • 总结

欢迎加入开源鸿蒙跨平台社区: 开源鸿蒙跨平台开发者社区

前言

喝水提醒应用的核心功能是帮助用户养成良好的饮水习惯,其中数据持久化和定时提醒是两个关键技术点。本文将详细介绍如何使用SharedPreferences实现数据存储,如何使用Timer.periodic实现定时提醒,以及如何设计直观的UI界面。

一、数据持久化系统

1.1 SharedPreferences集成

首先在pubspec.yaml中添加依赖:

dependencies:shared_preferences:^2.0.15

然后导入并在应用中使用:

import'package:shared_preferences/shared_preferences.dart';

1.2 数据保存

Future<void>_saveData()async{finalprefs=awaitSharedPreferences.getInstance();awaitprefs.setInt('current_water',_currentWater);finalrecordsJson=_records.map((record){return'${record.amount}|${record.timestamp.toIso8601String()}';}).toList();awaitprefs.setStringList('water_records',recordsJson);}

将当前饮水量和历史记录保存到本地存储。饮水量使用整数存储,记录列表转换为字符串列表存储,每条记录格式为"数量|时间戳"。

1.3 数据加载

Future<void>_loadData()async{finalprefs=awaitSharedPreferences.getInstance();setState((){_currentWater=prefs.getInt('current_water')??0;finalrecordsJson=prefs.getStringList('water_records');if(recordsJson!=null){_records=recordsJson.map((json){finalparts=json.split('|');returnWaterRecord(amount:int.parse(parts[0]),timestamp:DateTime.parse(parts[1]),);}).toList();}});}

从本地存储加载数据,恢复应用状态。使用??提供默认值,确保首次运行时不会出错。

二、定时提醒系统

2.1 Timer.periodic使用

Timer?reminderTimer;void_startReminder(){reminderTimer?.cancel();reminderTimer=Timer.periodic(constDuration(minutes:30),(timer){_showReminder();});}

每30分钟触发一次提醒。使用Timer.periodic创建周期性任务,返回的Timer对象可以用于取消任务。

2.2 提醒显示

void_showReminder(){if(mounted){ScaffoldMessenger.of(context).showSnackBar(constSnackBar(content:Text('该喝水了!'),duration:Duration(seconds:3),),);}}

使用SnackBar显示提醒信息。mounted检查确保组件仍然挂载,避免在组件销毁后显示错误。

2.3 定时器管理

@overridevoiddispose(){reminderTimer?.cancel();super.dispose();}

组件销毁时取消定时器,防止内存泄漏。

三、饮水记录管理

3.1 记录数据结构

classWaterRecord{finalint amount;finalDateTimetimestamp;WaterRecord({requiredthis.amount,requiredthis.timestamp});}

每条记录包含饮水量和时间戳。

3.2 添加记录

void_addWater(int amount){setState((){_currentWater+=amount;_records.add(WaterRecord(amount:amount,timestamp:DateTime.now(),));});_saveData();}

增加饮水量,添加记录,并保存到本地存储。

3.3 记录显示

ListView.builder(itemCount:_records.length,itemBuilder:(context,index){finalrecord=_records[index];finalhours=DateTime.now().difference(record.timestamp).inHours;returnListTile(title:Text('+${record.amount}ml'),subtitle:Text(hours<1?'刚刚':'$hours小时前喝过'),);},)

使用ListView显示历史记录,根据时间差显示友好的时间描述。

四、UI界面设计

4.1 进度显示

CircularProgressIndicator(value:_currentWater/_goal,strokeWidth:10,backgroundColor:Colors.grey.shade200,)

使用环形进度条显示当前进度,目标为2000ml。

4.2 快捷按钮

Row(mainAxisAlignment:MainAxisAlignment.spaceEvenly,children:[ElevatedButton(onPressed:()=>_addWater(200),child:constText('+200ml'),),ElevatedButton(onPressed:()=>_addWater(500),child:constText('+500ml'),),],)

提供200ml和500ml两个常用选项,方便快速记录。

4.3 统计信息

Text('今日已喝:$_currentWaterml/$_goalml',style:constTextStyle(fontSize:18,fontWeight:FontWeight.bold),)

显示当前饮水量和目标,让用户清晰了解进度。

五、状态管理

5.1 状态变量

int _currentWater=0;finalint _goal=2000;List<WaterRecord>_records=[];

使用简单的状态变量管理应用状态。

5.2 setState更新

setState((){_currentWater+=amount;});

使用setState触发UI更新,这是Flutter中最基本的状态管理方式。

六、用户体验优化

6.1 即时反馈

每次添加饮水后立即更新UI并保存数据,给用户即时反馈。

6.2 持久化保证

每次状态变化都保存到本地,确保应用重启后数据不丢失。

6.3 友好提示

使用SnackBar而不是AlertDialog,提醒不会打断用户当前操作。

总结

本文详细介绍了喝水提醒应用的数据持久化和定时提醒系统。从SharedPreferences的使用到Timer.periodic的应用,从数据结构设计到UI界面实现,每个技术点都直接影响应用的功能性和用户体验。通过这些技术的综合应用,实现了功能完整且实用的喝水提醒应用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 14:54:03

2026财务人新出路:别只做账房先生,用数据分析打开高薪通道

2026财务人员转型方向传统财务岗位的职责正在被自动化工具取代&#xff0c;财务人员需要掌握数据分析技能才能保持竞争力。数据分析能力可以帮助财务人员从基础核算转向战略决策支持&#xff0c;提升职业价值。传统财务岗位局限数据分析转型优势重复性高&#xff0c;易被自动化…

作者头像 李华
网站建设 2026/4/15 12:52:03

GWY系列钢材弯曲试验机

GWY系列钢材弯曲试验机 一、概述&#xff1a; GWY系列钢材弯曲试验机用于进行圆钢、棒材、板材、建筑螺纹钢、钢管的弯曲实验&#xff0c;可以进行正弯与反弯试验&#xff0c;测定其弯曲塑性弯形能力&#xff0c;是一款多功能钢材弯曲试验机。弯曲试样最大规格可选&#xff…

作者头像 李华
网站建设 2026/4/16 8:58:36

RDCMan:远程桌面管理的效率革命

RDCMan&#xff1a;远程桌面管理的效率革命 【免费下载链接】RDCMan Remote Desktop Connection Manager (微软RDP远程桌面管理工具) reflect 项目地址: https://gitcode.com/gh_mirrors/rd/RDCMan 在现代IT架构中&#xff0c;远程桌面管理已成为运维工作的核心环节。随…

作者头像 李华
网站建设 2026/4/16 10:39:55

医院HIS系统如何解决wangEditor粘贴Word表格变形?

《苏州程序员の暑假奇遇记&#xff1a;Word图片转存大作战》 日期&#xff1a;2023年7月15日 星期五 苏州 暴雨转晴&#xff08;适合宅家敲代码&#xff09; 第一章&#xff1a;需求诞生——从“懒癌晚期”到“技术狂魔” “客户爸爸说&#xff0c;他们每天要从Word里抠100张…

作者头像 李华