21天挑战应用


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

1. 项目概述

运行效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 应用简介

21天挑战是一款专注于习惯养成的轻量级应用,基于行为心理学中"21天养成一个习惯"的理念,通过可视化的进度追踪帮助用户坚持完成习惯养成挑战。应用采用简洁直观的界面设计,让用户专注于单一习惯的培养,避免同时培养多个习惯带来的注意力分散问题。

1.2 核心理念

行为心理学研究表明,一个人新的习惯或理念的形成与巩固,至少需要21天的时间。这一发现源于整形外科医生麦克斯韦尔·马尔茨的观察:截肢患者需要大约21天才能适应新的身体状态。此后,这一理论被广泛应用于习惯养成领域。

本应用的设计哲学建立在以下核心原则之上:

设计原则 具体体现
专注单一 每次只挑战一个习惯,避免贪多嚼不烂
可视化 21天网格直观展示进度,增强成就感
即时反馈 打卡即见效果,强化正向激励
简约至上 无复杂设置,开箱即用

1.3 功能特性

21天挑战

核心功能

创建挑战

预设习惯选择

自定义习惯

激励语设置

每日打卡

一键打卡

打卡状态切换

进度追踪

21天网格视图

完成百分比

连续打卡统计

辅助功能

日期选择

激励语句

挑战统计

2. 技术架构

2.1 整体架构

应用采用Flutter框架开发,遵循Material Design 3设计规范,整体架构简洁明了,适合快速迭代和功能扩展。

业务逻辑

数据层

表现层

ChallengeHomePage

进度卡片组件

日历网格组件

统计卡片组件

Challenge模型

状态管理State

打卡逻辑

进度计算

日期处理

2.2 目录结构

lib/
└── main_21day_challenge.dart
    ├── Day21ChallengeApp        # 应用入口
    ├── Challenge                # 挑战数据模型
    ├── ChallengeHomePage        # 主页面
    └── _ChallengeHomePageState  # 状态管理

2.3 技术选型

技术领域 选型方案 选型理由
UI框架 Flutter 3.x 跨平台一致性,开发效率高
设计规范 Material Design 3 现代化设计语言,组件丰富
状态管理 StatefulWidget 轻量级应用,无需复杂状态管理
数据持久化 内存存储(可扩展) 简单演示,可扩展SharedPreferences

3. 核心模块设计

3.1 数据模型设计

Challenge模型是应用的核心数据结构,封装了挑战的所有状态和计算逻辑:

class Challenge {
  final String id;              // 唯一标识
  final String habitName;       // 习惯名称
  final DateTime startDate;     // 开始日期
  final Set<int> checkedDays;   // 已打卡天数集合
  final String? motivation;     // 激励语
}

模型内置了丰富的计算属性,实现业务逻辑与UI的解耦:

属性名 类型 说明
totalDays int 总天数,固定为21
completedDays int 已完成天数
progressPercent double 完成百分比
currentDay int 当前第几天
isTodayChecked bool 今日是否已打卡
isCompleted bool 是否已完成挑战
isActive bool 挑战是否进行中
remainingDays int 剩余天数
streak int 连续打卡天数

3.2 进度计算算法

核心进度计算逻辑如下:

获取当前日期

计算与开始日期差值

差值 + 1

当前天数 = clamp 1-21

当前天数 <= 21?

挑战进行中

挑战已结束

计算完成率

完成率 = 已打卡天数 / 21 * 100

连续打卡天数的计算采用逆向遍历算法:

int get streak {
  int streak = 0;
  for (int i = currentDay; i >= 1; i--) {
    if (checkedDays.contains(i)) {
      streak++;
    } else {
      break;  // 遇到未打卡即中断
    }
  }
  return streak;
}

3.3 UI组件层次

Scaffold

CustomScrollView

SliverAppBar

SliverToBoxAdapter

FlexibleSpaceBar

挑战标题

激励语

进度卡片

日历网格

统计卡片

激励卡片

天数显示

环形进度

打卡按钮

21格GridView

图例说明

完成统计

连续打卡

4. 界面设计

4.1 主界面布局

主界面采用可滚动布局,顶部为固定标题栏,下方为内容区域:

区域 高度 内容
顶部栏 200dp 挑战名称、激励语
进度卡片 自适应 当前天数、环形进度、打卡按钮
日历网格 固定 21天打卡状态可视化
统计卡片 自适应 完成天数、连续打卡等
激励卡片 自适应 随机激励语句

4.2 色彩方案

应用以绿色为主色调,象征成长、希望与坚持:

ThemeData(
  colorScheme: ColorScheme.fromSeed(
    seedColor: const Color(0xFF4CAF50),  // Material Green 500
  ),
  useMaterial3: true,
)

色彩语义化应用:

颜色 用途 心理暗示
绿色 主色调、已完成状态 成长、希望、成功
橙色 剩余天数 提醒、注意
红色 连续打卡 热情、动力
灰色 未完成状态 中性、等待

4.3 日历网格设计

21天网格采用7列3行的布局,模拟日历周视图:

┌───┬───┬───┬───┬───┬───┬───┐
│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │  第1周
├───┼───┼───┼───┼───┼───┼───┤
│ 8 │ 9 │10 │11 │12 │13 │14 │  第2周
├───┼───┼───┼───┼───┼───┼───┤
│15 │16 │17 │18 │19 │20 │21 │  第3周
└───┴───┴───┴───┴───┴───┴───┘

网格状态视觉区分:

状态 视觉表现 交互
已打卡 绿色背景 + 白色勾选图标
今天 浅绿背景 + 绿色边框 + 圆圈图标 可点击打卡
未来 灰色背景 + 灰色数字
未完成 灰色背景 + 圆圈轮廓图标

5. 核心功能实现

5.1 创建挑战流程

State ModalBottomSheet HomePage 用户 State ModalBottomSheet HomePage 用户 点击创建挑战 显示底部弹窗 选择/输入习惯 设置激励语(可选) 选择开始日期 点击开始挑战 创建Challenge对象 更新UI状态 关闭弹窗

5.2 打卡功能实现

打卡逻辑采用状态切换模式,支持取消打卡:

void _checkToday() {
  if (_currentChallenge == null) return;
  
  setState(() {
    final newCheckedDays = Set<int>.from(_currentChallenge!.checkedDays);
    final currentDay = _currentChallenge!.currentDay;
    
    if (newCheckedDays.contains(currentDay)) {
      newCheckedDays.remove(currentDay);  // 取消打卡
    } else {
      newCheckedDays.add(currentDay);      // 添加打卡
    }
    
    _currentChallenge = _currentChallenge!.copyWith(
      checkedDays: newCheckedDays,
    );
  });
}

5.3 预设习惯列表

应用内置10个常见习惯供用户快速选择:

序号 习惯 类型
1 早起 生活作息
2 运动30分钟 健康锻炼
3 阅读30分钟 自我提升
4 冥想10分钟 心理健康
5 学习英语 技能学习
6 喝水8杯 健康习惯
7 早睡 生活作息
8 写日记 自我反思
9 不吃垃圾食品 饮食健康
10 练习书法 技能培养

5.4 激励语句系统

内置8条激励语句,随机展示以保持新鲜感:

final List<String> _motivations = [
  '坚持就是胜利!',
  '每一天都是新的开始',
  '习惯决定命运',
  '小步快跑,持续进步',
  '21天养成一个好习惯',
  '今天的努力是明天的收获',
  '成功源于日复一日的坚持',
  '你比想象中更强大',
];

6. 数据流与状态管理

6.1 状态流转

应用启动

创建挑战

每日打卡

21天全部打卡

开始新挑战

放弃挑战

无挑战

进行中

已完成

6.2 数据流向

应用采用单向数据流:

用户操作

Event Handler

State Update

UI Rebuild

新界面

7. 扩展性设计

7.1 数据持久化扩展

当前版本数据存储在内存中,可扩展为本地持久化:

// 使用SharedPreferences存储
Future<void> saveChallenge(Challenge challenge) async {
  final prefs = await SharedPreferences.getInstance();
  await prefs.setString('challenge_${challenge.id}', jsonEncode(challenge.toJson()));
}

// 使用Hive数据库(更高效的本地存储)
Future<void> initHive() async {
  await Hive.initFlutter();
  Hive.registerAdapter(ChallengeAdapter());
  await Hive.openBox<Challenge>('challenges');
}

7.2 功能扩展方向

扩展功能 实现方案 价值
历史记录 本地数据库存储 追溯过往挑战
提醒通知 flutter_local_notifications 防止遗忘打卡
社交分享 share_plus 增强成就感
数据统计 fl_chart图表 可视化长期数据
多挑战并行 挑战列表管理 满足进阶用户需求

7.3 主题扩展

可支持多主题切换:

// 预设主题配置
final themes = {
  'green': Color(0xFF4CAF50),   // 成长
  'blue': Color(0xFF2196F3),    // 专注
  'purple': Color(0xFF9C27B0),  // 创意
  'orange': Color(0xFFFF9800),  // 活力
};

8. 性能优化

8.1 渲染优化

优化项 实现方式 效果
列表渲染 GridView.builder 按需构建,减少内存
动画优化 AnimatedContainer 平滑过渡,避免卡顿
状态局部更新 setState精确控制 最小化重绘范围

8.2 内存管理

// 使用const构造函数减少重建
const SizedBox(height: 20);

// 使用shrinkWrap避免无限滚动
GridView.builder(
  shrinkWrap: true,
  physics: const NeverScrollableScrollPhysics(),
  // ...
)

9. 测试要点

9.1 功能测试用例

测试场景 预期结果 验证点
创建挑战 成功创建并显示 习惯名称、日期正确
今日打卡 状态切换成功 格子变绿,统计更新
取消打卡 状态恢复 格子恢复,统计更新
连续打卡 连续天数正确 streak计算准确
完成挑战 提示完成 21天全部打卡

9.2 边界条件测试

// 测试边界条件
test('currentDay should be clamped between 1 and 21', () {
  final challenge = Challenge(
    startDate: DateTime.now().subtract(Duration(days: 30)),
    // ...
  );
  expect(challenge.currentDay, equals(21));  // 最大值
});

test('progress should not exceed 100%', () {
  final challenge = Challenge(
    checkedDays: Set.from(List.generate(21, (i) => i + 1)),
    // ...
  );
  expect(challenge.progressPercent, equals(100.0));
});

10. 总结与展望

10.1 项目总结

21天挑战应用以简洁的设计理念,实现了习惯养成的核心功能。通过可视化的进度追踪和即时的打卡反馈,帮助用户建立并坚持好习惯。应用的技术架构清晰,代码组织合理,为后续功能扩展奠定了良好基础。

10.2 核心价值

维度 价值体现
用户价值 简单易用的习惯养成工具
技术价值 Flutter Material 3 实践案例
设计价值 可视化进度追踪设计参考

10.3 未来规划

v1.0 核心功能 单挑战管理 21天可视化 基础统计 v1.1 数据持久化 本地存储 历史记录 v1.2 增强功能 提醒通知 社交分享 v2.0 进阶功能 多挑战管理 数据分析 成就系统 21天挑战发展路线

11. 运行说明

11.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

11.2 运行命令

# 查看可用设备
flutter devices

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

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

# 运行到Windows
flutter run -d windows -t lib/main_21day_challenge.dart

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

12. 总结

21天挑战应用通过简洁的设计理念和直观的用户界面,帮助用户培养并坚持良好的习惯。应用基于行为心理学中"21天养成一个习惯"的理念,通过可视化的进度追踪和即时的打卡反馈,增强用户的成就感和坚持动力。

核心功能涵盖挑战创建、每日打卡、进度追踪等,支持预设习惯选择和自定义习惯,满足不同用户的需求。应用采用Flutter框架开发,遵循Material Design 3设计规范,具有良好的跨平台兼容性和扩展性。

通过本应用,希望能够帮助用户建立积极的生活习惯,实现自我提升和成长。

坚持21天,养成好习惯

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐