news 2026/7/17 5:31:19

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/7/14 3:13:21

深度测评!倾心之选的AI论文软件 —— 千笔ai写作

你是否在论文写作中感到无从下手&#xff1f;选题迷茫、思路混乱、文献查找困难、格式错误频出、查重率高得让人焦虑……这些困扰是不是让你夜不能寐&#xff1f;面对繁重的学术任务&#xff0c;很多同学都渴望一个高效、智能的写作助手。千笔AI正是为了解决这些问题而生&#…

作者头像 李华
网站建设 2026/7/15 2:51:15

再论自然数全加和-费马大定理

再来看费马大定理&#xff0c;要求证的是&#xff0c;没有正整数解。对于 &#xff0c;方程不可能成立&#xff1b;对于 ,对于任意正整数成立。对于2以及更高次&#xff0c;现在我们引入周期 &#xff0c;以及所有关于0的项目&#xff0c;转换成&#xff0c;考虑二项式定理&…

作者头像 李华
网站建设 2026/7/15 4:02:26

金融行业大文件上传解决方案中如何加入断点续传功能?

大文件传输系统建设方案 作为福建互联网上市公司项目负责人&#xff0c;针对公司大文件传输需求&#xff0c;我主导完成了从技术选型到架构设计的全流程工作。以下为系统性解决方案&#xff1a; 一、核心需求实现路径 跨平台兼容性设计 前端采用渐进增强策略&#xff1a; V…

作者头像 李华
网站建设 2026/7/15 3:35:07

还在为原神养成头秃?这款桌面神器让你少走90%弯路

还在为原神养成头秃&#xff1f;这款桌面神器让你少走90%弯路 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Hutao …

作者头像 李华
网站建设 2026/7/15 6:01:16

Linux系统Wi-Fi 6优化指南:Realtek 8852AE驱动配置与网络性能调优

Linux系统Wi-Fi 6优化指南&#xff1a;Realtek 8852AE驱动配置与网络性能调优 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 一、核心优势解析 Realtek 8852AE Wi-Fi 6驱动专为Linux系统深…

作者头像 李华
网站建设 2026/7/16 9:28:16

Unreal Engine塔防游戏开发从入门到精通:零基础完整指南

Unreal Engine塔防游戏开发从入门到精通&#xff1a;零基础完整指南 【免费下载链接】UnityTutorials-RTS The code for my series of tutorials on how to make a real-time stategy (RTS) game in the well-know Unity game engine (with C# scripting)! 项目地址: https:…

作者头像 李华