news 2026/4/23 9:59:41

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/21 2:51:04

大模型智能体设计模式:21种核心模式详解,助你成为AI专家

图1&#xff1a;21种智能体设计模式 21种智能体设计模式分别是提示链、路由、并行化、反思、工具使用、规划、多智能体协作、记忆管理、学习与适应、模型上下文协议、目标设定与监控、异常处理与恢复、人在回路、知识检索、智能体间通信、资源感知优化、推理技术、护栏与安全、…

作者头像 李华
网站建设 2026/4/23 9:59:36

构建成果转化新生态,助力高校科研迈入智能时代

在传统科技成果转化的道路上&#xff0c;诸多挑战与瓶颈正阻碍着科研成果从实验室走向市场。技术评估困难、市场需求匹配不精准、成果推广能力弱以及成果筛选与资源对接依赖人工等问题&#xff0c;成为高校科研转化中的常见痛点。面对这些难题&#xff0c;成果转化智能顾问应运…

作者头像 李华
网站建设 2026/4/22 17:08:05

从零搭建个人技术博客:工具选型、全流程实操与高性价比优化指南

一、为什么要搭建个人技术博客? 对开发者/技术创作者而言,个人技术博客是技术沉淀的载体、个人品牌的名片、技术交流的窗口: 沉淀知识:将零散的技术笔记、踩坑经验系统化,形成可复用的“技术知识库”; 展示能力:向面试官、同行直观呈现技术栈与实践经验,比简历更有说…

作者头像 李华
网站建设 2026/4/18 5:50:58

打造跨品牌智能家居安防系统:从设备互联到场景落地的探索指南

打造跨品牌智能家居安防系统&#xff1a;从设备互联到场景落地的探索指南 【免费下载链接】hass-xiaomi-miot Automatic integrate all Xiaomi devices to HomeAssistant via miot-spec, support Wi-Fi, BLE, ZigBee devices. 小米米家智能家居设备接入Hass集成 项目地址: ht…

作者头像 李华
网站建设 2026/4/23 9:59:36

7个高效数据处理技巧:从入门到精通Obsidian Dataview函数系统

7个高效数据处理技巧&#xff1a;从入门到精通Obsidian Dataview函数系统 【免费下载链接】obsidian-dataview A high-performance data index and query language over Markdown files, for https://obsidian.md/. 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-da…

作者头像 李华