欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260410191347517

image-20260410191355952

image-20260410191400213

image-20260410191405301

1.1 应用简介

喝水时间提醒是一款智能健康应用,根据用户的体重和活动量,智能计算并提醒喝水时间,帮助用户养成健康的饮水习惯。应用支持记录每天的喝水量,生成饮水趋势图表,提供个性化的饮水建议,让用户轻松掌握自己的饮水情况。

应用以清新的蓝色为主色调,象征水的纯净与健康。涵盖饮水概览、智能提醒、记录管理、数据统计四大模块。用户可以设置个人信息、查看饮水记录、接收智能提醒、分析饮水趋势,让健康饮水成为一种习惯。

1.2 核心功能

功能模块功能描述实现方式
个人设置体重、活动量、目标设置表单输入
智能提醒根据个人数据计算提醒时间算法计算
饮水记录记录每次饮水量快捷记录
数据统计每日/每周/每月饮水统计数据可视化
趋势分析饮水习惯趋势分析图表展示
目标管理设定每日饮水目标目标追踪
提醒管理自定义提醒时间和方式提醒设置
数据导出导出饮水记录数据数据导出

1.3 活动量等级定义

序号等级名称Emoji描述饮水量系数
1sedentary🪑久坐不动1.0
2轻度活动🚶轻度运动1.2
3中度活动🏃中等运动1.5
4重度活动🏋️高强度运动1.8
5极重活动🚴极高强度运动2.0

1.4 饮水提醒模式定义

序号模式名称Emoji描述提醒频率
1标准模式📱标准饮水提醒每小时
2健康模式💪健康饮水计划每45分钟
3运动模式🏃运动饮水计划每30分钟
4自定义⚙️自定义提醒自定义

1.5 饮水类型定义

序号类型名称Emoji容量描述
1小杯🥛100ml小容量饮水
2中杯🧊200ml标准容量
3大杯🍶300ml大容量饮水
4水瓶🧴500ml水瓶容量
5自定义⚙️自定义自定义容量

1.6 健康目标定义

序号目标名称Emoji描述达成条件
1初饮者🥤开始饮水习惯连续7天达标
2坚持者💧养成饮水习惯连续30天达标
3健康达人🏆保持健康习惯连续90天达标
4水分充足💪最佳饮水状态连续180天达标

1.7 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
状态管理Provider>= 6.0.0
数据存储SharedPreferences>= 2.0.0
图表库FL Chart>= 0.55.0
通知Flutter Local Notifications>= 14.0.0
目标平台鸿蒙OS / WebAPI 21+

1.8 项目结构

lib/
└── main_water_reminder.dart
    ├── WaterReminderApp                # 应用入口
    ├── ActivityLevel                   # 活动量等级枚举
    ├── ReminderMode                    # 提醒模式枚举
    ├── DrinkType                       # 饮水类型枚举
    ├── HealthGoal                      # 健康目标枚举
    ├── UserProfile                     # 用户档案模型
    ├── DrinkRecord                     # 饮水记录模型
    ├── ReminderSetting                 # 提醒设置模型
    ├── WaterReminderHomePage           # 主页面(底部导航)
    ├── _buildOverviewPage              # 概览页面
    ├── _buildReminderPage              # 提醒页面
    ├── _buildRecordPage                # 记录页面
    ├── _buildStatisticsPage            # 统计页面
    ├── WaterIntakeCalculator           # 饮水量计算器
    └── WaterTrendPainter               # 饮水趋势绘制器

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
WaterReminderHomePage

概览页

提醒页

记录页

统计页

饮水概览

目标进度

快速记录

提醒设置

提醒历史

饮水记录

记录详情

数据统计

趋势分析

健康报告

饮水量计算器
WaterIntakeCalculator

提醒管理器
ReminderManager

数据分析器
DataAnalyzer

UserProfile
用户档案

DrinkRecord
饮水记录

ReminderSetting
提醒设置

2.2 类图设计

has

has

uses

uses

uses

WaterReminderApp

+Widget build()

«enumeration»

ActivityLevel

+String label

+String emoji

+String description

+double multiplier

+sedentary()

+light()

+moderate()

+heavy()

+extreme()

«enumeration»

ReminderMode

+String label

+String emoji

+String description

+int interval

+standard()

+healthy()

+sport()

+custom()

UserProfile

+String id

+String name

+double weight

+ActivityLevel activityLevel

+int dailyGoal

+DateTime createdAt

DrinkRecord

+String id

+DateTime timestamp

+int amount

+String type

+String notes

ReminderSetting

+String id

+ReminderMode mode

+List<TimeOfDay> reminderTimes

+bool enabled

+String sound

WaterIntakeCalculator

+int calculateDailyIntake(UserProfile profile)

+List<TimeOfDay> calculateReminderTimes(UserProfile profile, ReminderMode mode)

ReminderManager

+void scheduleReminders(ReminderSetting setting)

+void cancelReminders()

+void showNotification(String message)

DataAnalyzer

+Map<String, int> analyzeDailyIntake(List<DrinkRecord> records)

+Map<String, int> analyzeWeeklyIntake(List<DrinkRecord> records)

+Map<String, int> analyzeMonthlyIntake(List<DrinkRecord> records)

2.3 页面导航流程

概览

提醒

记录

统计

应用启动

概览页

底部导航

查看饮水概览

设置提醒

记录饮水

查看统计

快速记录

查看目标

选择提醒模式

设置提醒时间

选择饮水量

保存记录

查看趋势

导出数据

2.4 提醒流程

提醒管理器 计算器 应用 用户 提醒管理器 计算器 应用 用户 loop [提醒周期] 设置个人信息 计算每日饮水量 返回推荐饮水量 选择提醒模式 计算提醒时间 返回提醒时间列表 设置提醒 调度提醒 发送提醒 记录饮水 更新饮水记录

三、核心模块设计

3.1 数据模型设计

3.1.1 活动量等级枚举 (ActivityLevel)
enum ActivityLevel {
  sedentary(label: '久坐不动', emoji: '🪑', description: '很少运动', multiplier: 1.0),
  light(label: '轻度活动', emoji: '🚶', description: '轻度运动', multiplier: 1.2),
  moderate(label: '中度活动', emoji: '🏃', description: '中等运动', multiplier: 1.5),
  heavy(label: '重度活动', emoji: '🏋️', description: '高强度运动', multiplier: 1.8),
  extreme(label: '极重活动', emoji: '🚴', description: '极高强度运动', multiplier: 2.0);

  final String label;
  final String emoji;
  final String description;
  final double multiplier;
  const ActivityLevel({
    required this.label,
    required this.emoji,
    required this.description,
    required this.multiplier,
  });
}
3.1.2 提醒模式枚举 (ReminderMode)
enum ReminderMode {
  standard(label: '标准模式', emoji: '📱', description: '标准饮水提醒', interval: 60),
  healthy(label: '健康模式', emoji: '💪', description: '健康饮水计划', interval: 45),
  sport(label: '运动模式', emoji: '🏃', description: '运动饮水计划', interval: 30),
  custom(label: '自定义', emoji: '⚙️', description: '自定义提醒', interval: 0);

  final String label;
  final String emoji;
  final String description;
  final int interval;
  const ReminderMode({
    required this.label,
    required this.emoji,
    required this.description,
    required this.interval,
  });
}
3.1.3 用户档案模型 (UserProfile)
class UserProfile {
  final String id;
  final String name;
  final double weight;
  final ActivityLevel activityLevel;
  final int dailyGoal;
  final DateTime createdAt;

  const UserProfile({
    required this.id,
    required this.name,
    required this.weight,
    required this.activityLevel,
    required this.dailyGoal,
    required this.createdAt,
  });

  UserProfile copyWith({
    String? id,
    String? name,
    double? weight,
    ActivityLevel? activityLevel,
    int? dailyGoal,
    DateTime? createdAt,
  }) {
    return UserProfile(
      id: id ?? this.id,
      name: name ?? this.name,
      weight: weight ?? this.weight,
      activityLevel: activityLevel ?? this.activityLevel,
      dailyGoal: dailyGoal ?? this.dailyGoal,
      createdAt: createdAt ?? this.createdAt,
    );
  }
}
3.1.4 饮水记录模型 (DrinkRecord)
class DrinkRecord {
  final String id;
  final DateTime timestamp;
  final int amount;
  final String type;
  final String notes;

  const DrinkRecord({
    required this.id,
    required this.timestamp,
    required this.amount,
    required this.type,
    required this.notes,
  });
}
3.1.5 饮水量分布
30% 25% 25% 20% 每日饮水量分布示例 早晨 上午 下午 晚上

3.2 页面结构设计

3.2.1 主页面布局

WaterReminderHomePage

IndexedStack

概览页

提醒页

记录页

统计页

NavigationBar

概览 Tab

提醒 Tab

记录 Tab

统计 Tab

3.2.2 概览页结构

概览页

SliverAppBar

饮水概览卡片

目标进度卡片

快速记录卡片

今日统计卡片

健康建议卡片

今日饮水量

达成率

剩余水量

目标进度条

连续天数

快捷饮水量按钮

自定义输入

时段分布

平均饮水间隔

3.2.3 提醒页结构

提醒页

SliverAppBar

提醒模式选择

提醒时间设置

提醒历史记录

提醒设置选项

模式卡片列表

时间选择器

预览提醒时间

今日提醒

历史提醒

3.2.4 统计页结构

统计页

SliverAppBar

时间范围选择

饮水量趋势

时段分布

健康分析

数据导出

每日趋势

每周趋势

每月趋势

时段饼图

高峰时段

饮水习惯分析

健康建议

3.3 饮水量计算逻辑

获取用户信息

计算基础饮水量

应用活动量系数

计算每日目标

计算提醒时间

根据模式确定间隔

生成提醒时间表

设置提醒

发送通知

用户饮水

记录饮水量

更新进度

达到目标?

完成目标

3.4 数据分析逻辑

获取饮水记录

按时间分组

计算时段总量

计算日均饮水量

生成趋势图表

分析饮水习惯

识别高峰时段

生成健康报告

提供改进建议

展示分析结果

导出数据


四、UI设计规范

4.1 配色方案

应用以清新的蓝色为主色调,象征水的纯净与健康:

颜色类型色值用途
主色#2196F3 (Blue)导航、主题元素
辅助色#42A5F5概览页面
第三色#64B5F6提醒页面
强调色#90CAF9记录页面
背景色#FAFAFA页面背景
卡片背景#FFFFFF信息卡片
警告色#FF9800提醒通知
成功色#4CAF50目标达成

4.2 活动量等级配色

等级色值视觉效果
久坐不动#9E9E9E灰色
轻度活动#4CAF50绿色
中度活动#2196F3蓝色
重度活动#FF9800橙色
极重活动#F44336红色

4.3 字体规范

元素字号字重颜色
页面标题24pxBold主色
饮水量显示48pxBold主色
目标进度20pxBold#000000
提醒时间16pxRegular#333333
统计数据14pxRegular#666666
提示文字12pxRegular#999999

4.4 组件规范

4.4.1 饮水概览卡片
┌─────────────────────────────────────┐
│  饮水概览                            │
│                                     │
│  ┌─────────────────────────────┐   │
│  │  💧 今日饮水                  │   │
│  │  1200ml / 2000ml            │   │
│  │  ━━━━━━━━━●────────── 60%    │   │
│  │  剩余: 800ml                │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
4.4.2 快速记录卡片
┌─────────────────────────────────────┐
│  快速记录                            │
│                                     │
│  ┌────────┐ ┌────────┐ ┌────────┐   │
│  │  🥛    │ │  🧊    │ │  🍶    │   │
│  │ 100ml  │ │ 200ml  │ │ 300ml  │   │
│  └────────┘ └────────┘ └────────┘   │
│                                     │
│  ┌─────────────────────────────┐   │
│  │  自定义: [     ] ml         │   │
│  └─────────────────────────────┘   │
│  [记录]                             │
└─────────────────────────────────────┘
4.4.3 提醒设置卡片
┌─────────────────────────────────────┐
│  提醒设置                            │
│                                     │
│  提醒模式: [标准模式 ▼]             │
│                                     │
│  提醒时间:                           │
│  08:00 · 09:00 · 10:00 · 11:00      │
│  12:00 · 13:00 · 14:00 · 15:00      │
│  16:00 · 17:00 · 18:00 · 19:00      │
│                                     │
│  [开启提醒] [关闭提醒]               │
└─────────────────────────────────────┘
4.4.4 统计图表卡片
┌─────────────────────────────────────┐
│  饮水趋势                            │
│                                     │
│  近7天饮水情况                        │
│  ━━━━━━━━━━━━━━━━━━━━━━             │
│  📈 平均: 1800ml/天                  │
│  📊 最高: 2200ml (周三)              │
│  📉 最低: 1500ml (周六)              │
│                                     │
│  [查看详情]                         │
└─────────────────────────────────────┘
4.4.5 健康建议卡片
┌─────────────────────────────────────┐
│  健康建议                            │
│                                     │
│  💡 饮水小贴士                        │
│                                     │
│  • 早晨起床后喝一杯温水              │
│  • 每小时至少喝200ml水              │
│  • 运动前后适当增加饮水量            │
│  • 避免一次性大量饮水                │
└─────────────────────────────────────┘

五、核心功能实现

5.1 饮水量计算器实现

class WaterIntakeCalculator {
  int calculateDailyIntake(UserProfile profile) {
    final baseIntake = profile.weight * 30; // 基础饮水量 = 体重(kg) * 30ml
    final adjustedIntake = baseIntake * profile.activityLevel.multiplier;
    return adjustedIntake.round();
  }

  List<TimeOfDay> calculateReminderTimes(UserProfile profile, ReminderMode mode) {
    List<TimeOfDay> times = [];
    int interval = mode.interval;
    
    if (interval == 0) {
      // 自定义模式,使用默认间隔
      interval = 60;
    }

    int startHour = 8;
    int endHour = 20;
    
    for (int hour = startHour; hour <= endHour; hour += interval ~/ 60) {
      times.add(TimeOfDay(hour: hour, minute: 0));
      if (interval < 60) {
        times.add(TimeOfDay(hour: hour, minute: interval));
      }
    }
    
    return times;
  }
}

5.2 提醒管理器实现

class ReminderManager {
  void scheduleReminders(ReminderSetting setting) {
    if (!setting.enabled) return;

    for (var time in setting.reminderTimes) {
      _scheduleReminder(time, setting.sound);
    }
  }

  void _scheduleReminder(TimeOfDay time, String sound) {
    // 计算今天的提醒时间
    final now = DateTime.now();
    final reminderTime = DateTime(
      now.year,
      now.month,
      now.day,
      time.hour,
      time.minute,
    );

    // 如果时间已过,设置为明天
    final scheduledTime = reminderTime.isBefore(now)
        ? reminderTime.add(const Duration(days: 1))
        : reminderTime;

    // 计算延迟时间
    final delay = scheduledTime.difference(now);

    // 调度提醒
    Future.delayed(delay, () {
      showNotification('该喝水了!保持水分充足');
    });
  }

  void showNotification(String message) {
    // 显示通知
    print('🔔 $message');
  }

  void cancelReminders() {
    // 取消所有提醒
  }
}

5.3 数据分析器实现

class DataAnalyzer {
  Map<String, int> analyzeDailyIntake(List<DrinkRecord> records) {
    Map<String, int> dailyIntake = {};
    
    for (var record in records) {
      final date = '${record.timestamp.year}-${record.timestamp.month}-${record.timestamp.day}';
      dailyIntake[date] = (dailyIntake[date] ?? 0) + record.amount;
    }
    
    return dailyIntake;
  }

  Map<String, int> analyzeWeeklyIntake(List<DrinkRecord> records) {
    Map<String, int> weeklyIntake = {};
    
    for (var record in records) {
      final weekStart = record.timestamp.subtract(Duration(days: record.timestamp.weekday - 1));
      final weekKey = '${weekStart.year}-${weekStart.month}-${weekStart.day}';
      weeklyIntake[weekKey] = (weeklyIntake[weekKey] ?? 0) + record.amount;
    }
    
    return weeklyIntake;
  }

  Map<String, int> analyzeMonthlyIntake(List<DrinkRecord> records) {
    Map<String, int> monthlyIntake = {};
    
    for (var record in records) {
      final monthKey = '${record.timestamp.year}-${record.timestamp.month}';
      monthlyIntake[monthKey] = (monthlyIntake[monthKey] ?? 0) + record.amount;
    }
    
    return monthlyIntake;
  }

  Map<String, int> analyzeHourlyIntake(List<DrinkRecord> records) {
    Map<String, int> hourlyIntake = {};
    
    for (var record in records) {
      final hourKey = '${record.timestamp.hour}:00';
      hourlyIntake[hourKey] = (hourlyIntake[hourKey] ?? 0) + record.amount;
    }
    
    return hourlyIntake;
  }
}

5.4 饮水记录实现

void _recordDrink(int amount, String type) {
  setState(() {
    _isRecording = true;
  });

  final record = DrinkRecord(
    id: 'record_${DateTime.now().millisecondsSinceEpoch}',
    timestamp: DateTime.now(),
    amount: amount,
    type: type,
    notes: '',
  );

  _drinkRecords.insert(0, record);
  _updateDailyIntake();

  setState(() {
    _isRecording = false;
  });
}

void _updateDailyIntake() {
  final today = DateTime.now();
  final todayRecords = _drinkRecords.where((record) {
    return record.timestamp.year == today.year &&
        record.timestamp.month == today.month &&
        record.timestamp.day == today.day;
  }).toList();

  _todayIntake = todayRecords.fold(0, (sum, record) => sum + record.amount);
  _progress = (_todayIntake / _userProfile.dailyGoal).clamp(0.0, 1.0);
}

5.5 目标达成检测实现

void _checkGoalAchievement() {
  if (_todayIntake >= _userProfile.dailyGoal) {
    if (!_goalAchievedToday) {
      _goalAchievedToday = true;
      _streakDays++;
      _showGoalAchievement();
    }
  }
}

void _showGoalAchievement() {
  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          const Text('🎉 恭喜!'),
          Text('今日饮水目标达成!连续 $streakDays 天'),
        ],
      ),
      backgroundColor: Colors.green,
    ),
  );
}

六、交互设计

6.1 饮水记录流程

提醒管理器 应用 用户 提醒管理器 应用 用户 alt [达到目标] loop [提醒周期] 打开应用 显示饮水概览 点击快速记录 显示饮水量选项 选择饮水量 记录饮水 更新进度 显示更新后的进度 显示目标达成通知 发送饮水提醒 响应提醒 记录饮水

6.2 提醒设置流程

标准/健康/运动

自定义

打开提醒页

选择提醒模式

模式类型

使用默认间隔

设置提醒间隔

预览提醒时间

调整提醒时间

保存设置

开启提醒

接收提醒通知

记录饮水

6.3 数据分析流程

选择范围

查看趋势

查看时段分布

查看健康分析

导出数据

统计页

选择时间范围

查看趋势

查看分布

查看分析

导出数据


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 2024-04-07 基础UI框架 饮水量计算 提醒功能实现 数据统计分析 健康建议系统 数据导出功能 智能学习系统 社交分享功能 云同步功能 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 喝水时间提醒应用开发计划

7.2 功能扩展建议

7.2.1 智能学习系统

学习功能:

  • 分析用户饮水习惯
  • 智能调整提醒时间
  • 个性化饮水建议
  • 季节饮水计划
7.2.2 社交分享功能

社交功能:

  • 邀请好友一起喝水
  • 饮水打卡分享
  • 健康饮水挑战
  • 排行榜竞争
7.2.3 云同步功能

同步功能:

  • 多设备数据同步
  • 数据备份恢复
  • 云端存储
  • 跨设备提醒

八、注意事项

8.1 开发注意事项

  1. 提醒可靠性:确保提醒能够及时准确发送

  2. 数据持久化:保证饮水记录数据不丢失

  3. 电池优化:提醒功能需考虑电池消耗

  4. 用户体验:记录操作需简单便捷

  5. 隐私保护:用户数据需安全存储

8.2 常见问题

问题原因解决方案
提醒不触发系统限制引导用户开启通知权限
数据丢失未及时保存增加自动保存机制
计算不准确个人数据错误提醒用户更新个人信息
电池消耗快后台运行优化提醒机制
界面卡顿数据量过大分页加载数据

8.3 使用技巧

💧 健康饮水小贴士 💧

最佳饮水时间

  • 早晨起床后:一杯温水唤醒身体
  • 餐前30分钟:促进消化
  • 餐后1小时:帮助吸收
  • 运动前:补充水分
  • 运动后:及时补水
  • 睡前1小时:适量饮水

饮水建议

  • 每天至少8杯水(约2000ml)
  • 小口慢饮,避免大口吞咽
  • 选择温水,避免过冷过热
  • 运动时增加饮水量
  • 保持规律的饮水习惯
  • 避免用饮料代替水

健康益处

  • 促进新陈代谢
  • 维持皮肤健康
  • 提高免疫力
  • 改善消化功能
  • 增强注意力
  • 预防脱水

九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+
Web浏览器Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_water_reminder.dart --web-port 8147

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_water_reminder.dart

# 代码分析
flutter analyze lib/main_water_reminder.dart

十、总结

喝水时间提醒应用通过智能提醒、饮水记录、数据分析等功能,帮助用户养成健康的饮水习惯。应用根据用户的体重和活动量,智能计算每日饮水量和提醒时间,让用户在正确的时间补充水分。

核心功能涵盖个人设置、智能提醒、饮水记录、数据统计四大模块。个人设置支持体重和活动量调整;智能提醒根据个人数据计算最佳饮水时间;饮水记录支持快速记录和自定义输入;数据统计提供详细的饮水趋势分析。

应用采用 Material Design 3 设计规范,以清新的蓝色为主色调,象征水的纯净与健康。通过本应用,希望能够帮助用户建立良好的饮水习惯,提高健康水平,让每一天都充满活力。

喝水时间提醒——让健康饮水成为习惯


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐