news 2026/3/1 5:54:49

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/2/28 15:29:09

【收藏学习】向量数据湖赋能Context Engineering:RAG到Agent的技术演进

这是基于2025 AICon大会的Milvus负责人刘力《RAG不止是检索&#xff1a;Milvus在Context Engineering中的湖仓一体实践》整理出的核心观点与关键技术要点总结。我认为接收一些会议/演讲类材料可用快速了解行业动态和趋势。从 RAG 到 Agent&#xff1a;向量数据湖驱动下一代 Con…

作者头像 李华
网站建设 2026/2/28 1:03:30

《解忧杂货铺》读书笔记——以善意赴山海,以温柔解迷茫

《解忧杂货铺》读书笔记——以善意赴山海&#xff0c;以温柔解迷茫 开篇&#xff1a;一间穿越时空的善意驿站 东野圭吾的《解忧杂货铺》&#xff0c;跳出了他一贯擅长的悬疑推理框架&#xff0c;以一间神奇的杂货铺为载体&#xff0c;用温柔细腻的笔触&#xff0c;编织出一个…

作者头像 李华
网站建设 2026/2/27 7:47:47

ThingsBoard - 更改数据库存储目录

安装ThingsBoard时&#xff0c;采用了postgres数据库的默认配置&#xff0c;经过几个月运行&#xff0c;数据库的存储目录满了&#xff0c;准备将该数据库迁移到D盘&#xff0c;方便扩容和备份。网上资料鱼龙混杂&#xff0c;记录下迁移过程。 需求说明 服务器是windows操作系统…

作者头像 李华
网站建设 2026/2/28 22:51:34

构建高校院所科技成果转化的数智化桥梁

在当今快速发展的科技时代&#xff0c;高校院所作为科研创新的重要基地&#xff0c;其科技成果的转化效率直接影响着国家的创新能力与产业竞争力。然而&#xff0c;在传统的科技成果转化过程中&#xff0c;信息壁垒和供需不对称问题一直是制约这一进程的关键因素。如何打破这些…

作者头像 李华
网站建设 2026/2/26 20:18:33

科技成果转化的创新引擎:构建区域协同发展的新生态

在当今这个创新驱动的时代&#xff0c;科技成果转化已然成为推动区域经济高质量发展的重要引擎。然而&#xff0c;在这一过程中&#xff0c;我们不得不正视一些现实问题&#xff1a;科技成果供需信息不对称、转化渠道不畅、专业化服务能力不足等问题&#xff0c;这些问题如同一…

作者头像 李华
网站建设 2026/2/25 1:14:07

传统转化困局破局之道——高校科研成果转化的生态协同机制探索

在当前创新驱动发展的大背景下&#xff0c;高校作为科技创新的重要策源地&#xff0c;其科研成果的转化效率直接影响着国家整体创新能力的提升。然而&#xff0c;在实际操作中&#xff0c;传统的科研成果转化模式却面临着诸多瓶颈与挑战。这些困境不仅制约了高校科研成果的社会…

作者头像 李华