开源鸿蒙跨平台Flutter开发:戒烟助手应用
戒烟助手应用摘要: 一款基于Flutter开发的跨平台戒烟管理应用,采用Material Design 3设计规范,支持鸿蒙OS和Web平台。核心功能包括:记录戒烟天数、计算节省金额、追踪健康里程碑、提供戒烟知识库和紧急帮助。应用通过日期计算、价格计算和里程碑系统,帮助用户量化戒烟成果(如节省金额、未吸烟支数)并追踪身体恢复进度(12个健康里程碑)。提供四种吸烟频率选择(轻度至严重),支持自定义香
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图




1.1 应用简介
戒烟助手是一款专注于帮助用户戒烟的健康管理应用,通过记录戒烟天数、计算节省金额、追踪健康改善、提供戒烟知识等功能,帮助用户成功戒烟。应用以清新的绿色为主色调,象征健康与新生。
应用涵盖首页、进度、知识、设置四大模块。用户可以设置戒烟开始日期和吸烟频率,应用会自动计算戒烟天数、节省金额、未吸烟支数等数据;通过健康里程碑追踪身体恢复状况;学习戒烟知识和技巧;在烟瘾发作时获得即时帮助。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 戒烟记录 | 记录戒烟天数和历程 | 日期计算 |
| 节省计算 | 计算节省的金钱 | 价格计算 |
| 健康追踪 | 追踪身体恢复状况 | 里程碑系统 |
| 知识库 | 提供戒烟知识和技巧 | 内容展示 |
| 紧急帮助 | 烟瘾发作时的应对方法 | 对话框提示 |
| 成就分享 | 分享戒烟成就 | 分享功能 |
1.3 吸烟频率定义
| 序号 | 频率名称 | Emoji | 每日支数 | 描述 |
|---|---|---|---|---|
| 1 | 轻度吸烟 | 🚬 | 5 | 每天少于5支 |
| 2 | 中度吸烟 | 🚬🚬 | 10 | 每天5-15支 |
| 3 | 重度吸烟 | 🚬🚬🚬 | 20 | 每天15-25支 |
| 4 | 严重吸烟 | 🚬🚬🚬🚬 | 30 | 每天超过25支 |
1.4 健康里程碑定义
| 序号 | 里程碑 | Emoji | 时间 | 描述 |
|---|---|---|---|---|
| 1 | 20分钟 | ⏱️ | 20分钟 | 心率和血压开始下降 |
| 2 | 12小时 | 🕐 | 12小时 | 血液中的一氧化碳水平恢复正常 |
| 3 | 2天 | 📅 | 2天 | 味觉和嗅觉开始恢复 |
| 4 | 2周 | 📆 | 2周 | 血液循环改善,肺功能提高 |
| 5 | 1个月 | 🗓️ | 1个月 | 咳嗽和气短明显减少 |
| 6 | 3个月 | 📅 | 3个月 | 肺功能显著改善 |
| 7 | 6个月 | 📆 | 6个月 | 呼吸困难大幅减少 |
| 8 | 1年 | 🎂 | 1年 | 心脏病风险降低一半 |
| 9 | 5年 | 🎊 | 5年 | 中风风险降至非吸烟者水平 |
| 10 | 10年 | 🎉 | 10年 | 肺癌风险降低一半 |
1.5 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 计时器 | Timer | - |
| 状态管理 | setState | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.6 项目结构
lib/
└── main_quit_smoking.dart
├── QuitSmokingApp # 应用入口
├── SmokingFrequency # 吸烟频率枚举
├── HealthMilestone # 健康里程碑枚举
├── QuitRecord # 戒烟记录模型
├── QuitSmokingHomePage # 主页面(底部导航)
├── _buildHomePage # 首页
├── _buildProgressPage # 进度页
├── _buildKnowledgePage # 知识页
├── _buildSettingsPage # 设置页
├── _updateQuitDate # 更新戒烟日期
├── _updateFrequency # 更新吸烟频率
└── _updatePrice # 更新香烟价格
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 戒烟计算流程
三、核心模块设计
3.1 数据模型设计
3.1.1 吸烟频率枚举 (SmokingFrequency)
enum SmokingFrequency {
light(label: '轻度吸烟', emoji: '🚬', cigarettesPerDay: 5, description: '每天少于5支'),
moderate(label: '中度吸烟', emoji: '🚬🚬', cigarettesPerDay: 10, description: '每天5-15支'),
heavy(label: '重度吸烟', emoji: '🚬🚬🚬', cigarettesPerDay: 20, description: '每天15-25支'),
severe(label: '严重吸烟', emoji: '🚬🚬🚬🚬', cigarettesPerDay: 30, description: '每天超过25支');
final String label;
final String emoji;
final int cigarettesPerDay;
final String description;
const SmokingFrequency({
required this.label,
required this.emoji,
required this.cigarettesPerDay,
required this.description,
});
}
3.1.2 健康里程碑枚举 (HealthMilestone)
enum HealthMilestone {
twentyMinutes(label: '20分钟', emoji: '⏱️', description: '心率和血压开始下降'),
twelveHours(label: '12小时', emoji: '🕐', description: '血液中的一氧化碳水平恢复正常'),
twoDays(label: '2天', emoji: '📅', description: '味觉和嗅觉开始恢复'),
twoWeeks(label: '2周', emoji: '📆', description: '血液循环改善,肺功能提高'),
oneMonth(label: '1个月', emoji: '🗓️', description: '咳嗽和气短明显减少'),
threeMonths(label: '3个月', emoji: '📅', description: '肺功能显著改善'),
sixMonths(label: '6个月', emoji: '📆', description: '呼吸困难大幅减少'),
oneYear(label: '1年', emoji: '🎂', description: '心脏病风险降低一半'),
fiveYears(label: '5年', emoji: '🎊', description: '中风风险降至非吸烟者水平'),
tenYears(label: '10年', emoji: '🎉', description: '肺癌风险降低一半');
final String label;
final String emoji;
final String description;
const HealthMilestone({
required this.label,
required this.emoji,
required this.description,
});
}
3.1.3 戒烟记录模型 (QuitRecord)
class QuitRecord {
final String id; // 记录ID
final DateTime quitDate; // 戒烟日期
final SmokingFrequency frequency; // 吸烟频率
final double pricePerPack; // 每包价格
final int cigarettesPerPack; // 每包支数
QuitRecord({
required this.id,
required this.quitDate,
required this.frequency,
required this.pricePerPack,
required this.cigarettesPerPack,
});
// 戒烟天数
int get daysSinceQuit => DateTime.now().difference(quitDate).inDays;
// 未吸烟支数
int get cigarettesNotSmoked => daysSinceQuit * frequency.cigarettesPerDay;
// 节省金额
double get moneySaved => (cigarettesNotSmoked / cigarettesPerPack) * pricePerPack;
// 延长生命(每支烟减少11分钟生命)
int get lifeDaysSaved => (cigarettesNotSmoked * 11) ~/ 60;
}
3.1.4 吸烟频率分布
3.1.5 戒烟时长分布
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 首页结构
3.2.3 进度页结构
3.2.4 知识页结构
3.3 戒烟计算逻辑
3.4 激励语录轮播逻辑
四、UI设计规范
4.1 配色方案
应用以清新的绿色为主色调,象征健康与新生:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #4CAF50 (Green) | 导航、主题元素 |
| 辅助色 | #66BB6A | 进度页面 |
| 第三色 | #81C784 | 知识页面 |
| 强调色 | #A5D6A7 | 设置页面 |
| 背景色 | #FAFAFA | 页面背景 |
| 卡片背景 | #FFFFFF | 功能卡片 |
4.2 功能模块颜色
| 模块 | 色值 | 视觉效果 |
|---|---|---|
| 戒烟天数 | #4CAF50 | 绿色 |
| 节省金额 | #4CAF50 | 绿色 |
| 未吸烟 | #FF9800 | 橙色 |
| 延长生命 | #F44336 | 红色 |
4.3 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 24px | Bold | 主色 |
| 戒烟天数 | 32px | Bold | 白色 |
| 统计数字 | 24px | Bold | 模块颜色 |
| 激励语录 | 18px | Medium | 白色 |
| 知识内容 | 14px | Regular | #000000 |
4.4 组件规范
4.4.1 激励语录卡片
┌─────────────────────────────────────┐
│ ❝ │
│ │
│ 每一次拒绝香烟,都是对自己健康的 │
│ 投资! │
│ │
└─────────────────────────────────────┘
4.4.2 统计卡片
┌─────────────────────────────────────┐
│ 💰 🚭 ❤️ │
│ ¥600 300支 5天 │
│ 已省金额 未吸烟支数 延长生命(天) │
└─────────────────────────────────────┘
4.4.3 健康改善列表
┌─────────────────────────────────────┐
│ ❤️ 健康改善 │
│ │
│ ⏱️ 20分钟 心率和血压开始下降 ✓ │
│ 🕐 12小时 血液中一氧化碳恢复正常 ✓ │
│ 📅 2天 味觉和嗅觉开始恢复 ✓ │
└─────────────────────────────────────┘
4.4.4 快速操作按钮
┌─────────────────────────────────────┐
│ 快速操作 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 🆘 │ │ 🎉 │ │
│ │ 想吸烟时 │ │ 分享成就 │ │
│ └──────────┘ └──────────┘ │
└─────────────────────────────────────┘
4.4.5 里程碑时间线
┌─────────────────────────────────────┐
│ 健康里程碑 │
│ │
│ ⏱️──● 20分钟 │
│ 心率和血压开始下降 │
│ │
│ 🕐──○ 12小时 │
│ 血液中一氧化碳恢复正常 │
└─────────────────────────────────────┘
五、核心功能实现
5.1 戒烟记录计算
class QuitRecord {
final DateTime quitDate;
final SmokingFrequency frequency;
final double pricePerPack;
final int cigarettesPerPack;
// 戒烟天数
int get daysSinceQuit => DateTime.now().difference(quitDate).inDays;
// 未吸烟支数
int get cigarettesNotSmoked => daysSinceQuit * frequency.cigarettesPerDay;
// 节省金额
double get moneySaved => (cigarettesNotSmoked / cigarettesPerPack) * pricePerPack;
// 延长生命(每支烟减少11分钟生命)
int get lifeDaysSaved => (cigarettesNotSmoked * 11) ~/ 60;
}
5.2 健康里程碑判断
bool _isMilestoneAchieved(int days, HealthMilestone milestone) {
switch (milestone) {
case HealthMilestone.twentyMinutes:
return days >= 0;
case HealthMilestone.twelveHours:
return days >= 1;
case HealthMilestone.twoDays:
return days >= 2;
case HealthMilestone.twoWeeks:
return days >= 14;
case HealthMilestone.oneMonth:
return days >= 30;
case HealthMilestone.threeMonths:
return days >= 90;
case HealthMilestone.sixMonths:
return days >= 180;
case HealthMilestone.oneYear:
return days >= 365;
case HealthMilestone.fiveYears:
return days >= 1825;
case HealthMilestone.tenYears:
return days >= 3650;
}
}
5.3 激励语录轮播
void _startUpdateTimer() {
_updateTimer = Timer.periodic(const Duration(seconds: 30), (timer) {
setState(() {
_currentQuoteIndex = (_currentQuoteIndex + 1) % _motivationalQuotes.length;
});
});
}
Widget _buildMotivationalQuote() {
return Card(
elevation: 4,
color: Theme.of(context).colorScheme.primaryContainer,
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
children: [
const Icon(Icons.format_quote, size: 32, color: Colors.white),
const SizedBox(height: 12),
Text(
_motivationalQuotes[_currentQuoteIndex],
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
color: Colors.white,
),
),
],
),
),
);
}
5.4 紧急帮助对话框
void _showEmergencyHelp() {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('想吸烟时'),
content: const Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('试试这些方法:'),
SizedBox(height: 16),
Text('1. 深呼吸10次'),
Text('2. 喝一杯冷水'),
Text('3. 嚼口香糖'),
Text('4. 散步5分钟'),
Text('5. 给朋友打电话'),
SizedBox(height: 16),
Text('记住:烟瘾通常只持续几分钟!'),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text('我知道了'),
),
],
);
},
);
}
5.5 成就分享
void _shareAchievement() {
final record = _quitRecord;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
'我已成功戒烟${record.daysSinceQuit}天!节省了¥${record.moneySaved.toStringAsFixed(0)},少吸了${record.cigarettesNotSmoked}支烟!',
),
action: SnackBarAction(
label: '分享',
onPressed: () {
// 实现分享功能
},
),
),
);
}
六、交互设计
6.1 戒烟记录流程
6.2 紧急帮助流程
6.3 知识学习流程
七、扩展功能规划
7.1 后续版本规划
7.2 功能扩展建议
7.2.1 本地数据存储
存储功能:
- SharedPreferences存储设置
- SQLite存储戒烟记录
- 数据导入导出
- 数据备份恢复
7.2.2 社交分享
分享功能:
- 分享戒烟成就到社交平台
- 生成成就海报
- 邀请好友一起戒烟
- 戒烟打卡分享
7.2.3 成就系统
成就功能:
- 戒烟里程碑徽章
- 连续戒烟奖励
- 健康改善成就
- 金钱节省成就
7.2.4 社区功能
社区功能:
- 戒烟社区交流
- 经验分享
- 互相鼓励
- 专家答疑
八、注意事项
8.1 开发注意事项
-
数据计算:确保戒烟天数、节省金额等计算准确
-
日期处理:正确处理日期计算和时区问题
-
定时器管理:正确创建和销毁定时器
-
用户体验:激励语录需定期更新,保持新鲜感
-
数据持久化:确保用户数据安全存储
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 天数计算错误 | 时区问题 | 使用本地时区 |
| 金额不准确 | 价格设置错误 | 验证输入值 |
| 里程碑不更新 | 判断逻辑错误 | 检查判断条件 |
| 语录不轮播 | 定时器未启动 | 检查定时器 |
| 数据丢失 | 未持久化存储 | 添加本地存储 |
8.3 使用技巧
🚭 戒烟成功技巧 🚭
心理准备
- 明确戒烟原因,坚定决心
- 告诉家人朋友,寻求支持
- 设定戒烟日期,做好准备
- 识别触发情境,提前准备
应对烟瘾
- 深呼吸:缓慢深呼吸10次
- 喝水:喝一杯冷水,慢慢品尝
- 延迟:等待10分钟,烟瘾通常会过去
- 分散注意力:做其他事情转移注意力
保持动力
- 每天查看戒烟天数
- 关注健康改善
- 计算节省金额
- 分享戒烟成就
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
| Web浏览器 | Chrome 90+ |
9.2 运行命令
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_quit_smoking.dart --web-port 8139
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_quit_smoking.dart
# 代码分析
flutter analyze lib/main_quit_smoking.dart
十、总结
戒烟助手应用通过首页、进度、知识、设置四大模块,为用户提供了一个全面的戒烟辅助平台。应用支持戒烟天数记录、节省金额计算、健康改善追踪、戒烟知识学习等功能,帮助用户成功戒烟。
核心功能涵盖戒烟记录、金钱计算、健康追踪、知识库四大模块。戒烟记录自动计算戒烟天数、未吸烟支数;金钱计算根据吸烟频率和香烟价格计算节省金额;健康追踪通过里程碑系统展示身体恢复状况;知识库提供戒烟好处、技巧、应对烟瘾方法等内容。
应用采用 Material Design 3 设计规范,以清新的绿色为主色调,象征健康与新生。通过本应用,希望能够帮助用户成功戒烟,重获健康生活。
戒烟助手——助你成功戒烟,重获健康
项目链接
- 应用代码:
f:\Flutter\flutter_harmonyos\lib\main_quit_smoking.dart - 开发文档:
f:\Flutter\flutter_harmonyos\docs\戒烟助手应用开发文档.md
运行效果图
(图片将在此处添加)
© 2024 戒烟助手应用开发团队
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)