当前位置: 首页 > news >正文

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界面实现,每个技术点都直接影响应用的功能性和用户体验。通过这些技术的综合应用,实现了功能完整且实用的喝水提醒应用。

http://www.jsqmd.com/news/361188/

相关文章:

  • 盘点2026年佛山地区诚信可靠的GEO推广品牌企业 - 工业推荐榜
  • 功能沙发哪个好?市场上备受瞩目的五大品牌,值得入选! - 速递信息
  • 总结速冻甜玉米粒厂商,福建地区性价比高的品牌有哪些 - 工业设备
  • 国产氧氮氢分析仪优质厂家揭秘:专业推荐与选购指南(2026新版) - 品牌推荐大师1
  • 聊聊山东值得推荐的速冻蔬菜供应商,看看有哪些靠谱品牌 - 工业推荐榜
  • 别再瞎找了!降AIGC工具 千笔·降AIGC助手 VS 学术猹,本科生专属神器
  • 2026 年零食品牌排行前十:安全靠谱的零食品牌推荐、挑选指南与选购建议 - Top品牌推荐
  • 是振荡器? 还是斜率鉴频器?
  • tinyLora
  • 2026年靠谱的速冻胡萝卜丁生产厂家排名,选对不踩坑 - 工业设备
  • 2026年想找经典好吃的零食推荐?从一袋「旺旺米果」开始就对了 - Top品牌推荐
  • 从零开始学RAG:大模型检索增强生成完全指南(程序员必看,建议收藏)
  • 高性价比AI语音配音网哪个口碑好?出奇科技值得关注 - 工业品网
  • MPI学习资源
  • 深度测评!倾心之选的AI论文软件 —— 千笔ai写作
  • 保险行业大文件上传插件如何实现断点续传和安全性加密?
  • 2026年天津助听器专卖店推荐:基于多场景听力实测排名,针对复杂环境聆听与操作繁琐痛点 - 十大品牌推荐
  • 导师严选!千笔·降AI率助手,本科生论文降重首选
  • 天猫超市购物卡回收实操全攻略 - 京顺回收
  • 高校科研成果转化的生态协同新路径
  • 2026年2月广东省考面试班品牌推荐,师资、通过率、服务三维数据透视 - 品牌鉴赏师
  • Transformer自注意力机制核心原理解析:Q/K/V与token相似度的关系
  • 国防文档系统如何解决wangEditor粘贴Word图片模糊问题?
  • 2026年天津助听器专卖店推荐:权威评测与选型避坑全指南 - 十大品牌推荐
  • 传统转化困局破局之道——高校科研成果转化的生态协同机制探索
  • RouteRAG:小模型的自规划检索强化学习方案,性能媲美GPT-4o
  • 2026年广州助听器专卖店推荐:基于长期使用稳定性评价,涵盖老年与突发性耳聋场景 - 十大品牌推荐
  • 《解忧杂货铺》读书笔记——以善意赴山海,以温柔解迷茫
  • 2026年广州助听器专卖店终极评测(行业报告+用户口碑双重背书)| 听力解决方案选型避坑全指南 - 十大品牌推荐
  • 从此告别拖延!顶流之选的一键生成论文工具 —— 千笔·专业论文写作工具