Flutter 框架跨平台鸿蒙开发 - 恋爱纪念日应用开发文档
摘要: 恋爱纪念日应用是一款基于Flutter开发的跨平台情侣纪念日管理工具,支持鸿蒙OS和Web平台。应用以粉色主题营造浪漫氛围,核心功能包括:实时计算恋爱天数、自动生成纪念日(100天、520天、周年等)、自定义纪念日添加,以及周/月/年统计展示。技术栈采用Flutter 3.0+和Dart 2.17+,架构分为表现层、数据层和业务逻辑层,通过状态管理实现日期计算、纪念日排序和用户设置。项目结
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图



1.1 应用简介
恋爱纪念日应用是一款专为情侣设计的纪念日记录与追踪工具,旨在帮助情侣记录和纪念恋爱中的重要时刻。应用以粉色为主色调,营造浪漫温馨的氛围,让用户能够直观地看到在一起的天数、即将到来的纪念日,以及已经过去的美好时光。
应用支持自定义双方名字、设置恋爱开始日期,自动计算在一起的天数、周数、月数和年数。同时自动生成重要纪念日(如100天、520天、1周年等),用户也可以手动添加自定义纪念日,不错过任何一个值得纪念的日子。
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 天数计算 | 在一起天数实时计算 | DateTime差值计算 |
| 纪念日列表 | 自动生成+手动添加 | 列表排序展示 |
| 倒计时显示 | 下一个纪念日倒计时 | 日期差值计算 |
| 名字设置 | 自定义双方名字 | 状态管理 |
| 日期设置 | 设置恋爱开始日期 | DatePicker |
| 时间统计 | 周/月/年统计展示 | 数值计算 |
1.3 纪念日类型
| 类型 | 触发条件 | 说明 |
|---|---|---|
| 周年纪念 | 每年同一天 | 1周年、2周年… |
| 天数纪念 | 特定天数 | 100天、520天、999天… |
| 自定义纪念 | 用户添加 | 生日、情人节等 |
1.4 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 目标平台 | 鸿蒙OS / Web | API 21+ |
1.5 项目结构
lib/
└── main_anniversary.dart
├── AnniversaryApp # 应用入口
├── AnniversaryEvent # 纪念日数据模型
├── MainPage # 主页面(底部导航)
├── HomePage # 首页展示
├── EventsPage # 纪念日列表页
└── SettingsPage # 设置页面
二、系统架构
2.1 整体架构图
2.2 类图设计
2.3 页面导航流程
2.4 数据流向图
三、核心模块设计
3.1 数据模型设计
3.1.1 纪念日模型 (AnniversaryEvent)
class AnniversaryEvent {
final String id; // 唯一标识
final String name; // 纪念日名称
final DateTime date; // 纪念日日期
final String? note; // 备注
final bool isYearly; // 是否每年重复
AnniversaryEvent({
required this.id,
required this.name,
required this.date,
this.note,
this.isYearly = false,
});
}
3.1.2 纪念日分布
3.2 页面结构设计
3.2.1 主页面布局
3.2.2 首页结构
3.2.3 纪念日列表结构
3.3 计算逻辑设计
3.3.1 天数计算
int get _daysTogether {
if (_startDate == null) return 0;
return DateTime.now().difference(_startDate!).inDays;
}
3.3.2 纪念日生成逻辑
四、UI设计规范
4.1 配色方案
应用采用粉色为主色调,营造浪漫温馨的氛围:
| 颜色类型 | 色值 | 用途 |
|---|---|---|
| 主色 | #E91E63 (Pink) | 导航、强调元素 |
| 渐变起始 | #F48FB1 (Pink 300) | 头部渐变 |
| 渐变结束 | #EC407A (Pink 500) | 头部渐变 |
| 计数器数字 | #EC407A | 天数显示 |
| 卡片背景 | #FFFFFF | 内容卡片 |
| 页面背景 | #FAFAFA | 页面底色 |
4.2 字体规范
| 元素 | 字号 | 字重 | 颜色 |
|---|---|---|---|
| 页面标题 | 20px | Medium | #000000 |
| 天数数字 | 72px | Bold | Pink 400 |
| 纪念日名称 | 16px | Bold | #000000 |
| 日期文字 | 14px | Regular | #757575 |
| 倒计时数字 | 24px | Bold | Pink 400 |
4.3 组件规范
4.3.1 头部布局
┌─────────────────────────────────────────────────┐
│ │
│ ┌────┐ ❤️ ┌────┐ │
│ │ 他 │ ♥♥♥ │ 她 │ │
│ └────┘ └────┘ │
│ │
│ 他 & 她 │
│ 2023年2月14日 │
│ │
└─────────────────────────────────────────────────┘
4.3.2 天数计数器
┌─────────────────────────────────────────────────┐
│ │
│ 我们在一起 │
│ │
│ 365 天 │
│ │
│ 8760小时 525600分钟 31536000秒 │
│ │
└─────────────────────────────────────────────────┘
4.3.3 纪念日卡片
┌─────────────────────────────────────────────────┐
│ ┌──────┐ 1周年 > │
│ │ 14 │ 2024年2月14日 30 │
│ │ 2月 │ 天后 │
│ └──────┘ │
└─────────────────────────────────────────────────┘
五、核心功能实现
5.1 天数计算实现
int get _daysTogether {
if (_startDate == null) return 0;
return DateTime.now().difference(_startDate!).inDays;
}
Widget _buildDaysCounter() {
return Container(
child: Column(
children: [
Text('我们在一起'),
Row(
children: [
Text('$daysTogether', style: TextStyle(fontSize: 72)),
Text('天'),
],
),
_buildTimeBreakdown(),
],
),
);
}
5.2 纪念日自动生成
void _generateDefaultEvents() {
final start = _startDate!;
_events.clear();
// 生成周年纪念
for (int i = 1; i <= 10; i++) {
_events.add(AnniversaryEvent(
id: 'year_$i',
name: '${i}周年',
date: DateTime(start.year + i, start.month, start.day),
));
}
// 生成特殊天数纪念
final specialDays = [
{'days': 100, 'name': '100天'},
{'days': 520, 'name': '520天'},
{'days': 999, 'name': '999天'},
{'days': 1314, 'name': '1314天'},
];
for (var special in specialDays) {
final targetDate = start.add(Duration(days: special['days'] as int));
if (targetDate.isAfter(DateTime.now())) {
_events.add(AnniversaryEvent(
id: 'special_${special['days']}',
name: special['name'] as String,
date: targetDate,
));
}
}
_events.sort((a, b) => a.date.compareTo(b.date));
}
5.3 下一个纪念日显示
Widget _buildNextAnniversary() {
final now = DateTime.now();
final upcoming = events.where((e) => e.date.isAfter(now)).toList();
if (upcoming.isEmpty) return SizedBox.shrink();
final next = upcoming.first;
final daysLeft = next.date.difference(now).inDays;
return Container(
child: Row(
children: [
Container(
child: Text('$daysLeft'),
),
Column(
children: [
Text('下一个纪念日'),
Text(next.name),
Text('${next.date.year}年${next.date.month}月${next.date.day}日'),
],
),
],
),
);
}
5.4 时间分解显示
Widget _buildTimeBreakdown() {
final hours = daysTogether * 24;
final minutes = hours * 60;
final seconds = minutes * 60;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
_buildTimeItem('$hours', '小时'),
_buildTimeItem('$minutes', '分钟'),
_buildTimeItem('$seconds', '秒'),
],
);
}
5.5 添加自定义纪念日
void _showAddEventDialog(BuildContext context) {
final nameController = TextEditingController();
DateTime selectedDate = DateTime.now().add(Duration(days: 1));
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('添加纪念日'),
content: Column(
children: [
TextField(
controller: nameController,
decoration: InputDecoration(labelText: '纪念日名称'),
),
ListTile(
title: Text('选择日期'),
onTap: () async {
final picked = await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime(2000),
lastDate: DateTime(2100),
);
if (picked != null) {
selectedDate = picked;
}
},
),
],
),
actions: [
TextButton(child: Text('取消'), onPressed: () => Navigator.pop(context)),
TextButton(child: Text('添加'), onPressed: () {
onAdd(AnniversaryEvent(
id: DateTime.now().millisecondsSinceEpoch.toString(),
name: nameController.text,
date: selectedDate,
));
Navigator.pop(context);
}),
],
),
);
}
六、交互设计
6.1 日期设置流程
6.2 名字设置流程
6.3 纪念日管理流程
七、扩展功能规划
7.1 后续版本规划
7.2 功能扩展建议
7.2.1 数据持久化
本地数据存储:
- 使用SharedPreferences存储配置
- 使用SQLite存储纪念日数据
- 支持数据导入导出
7.2.2 提醒功能
纪念日提醒:
- 提前1天/3天/7天提醒
- 自定义提醒时间
- 推送通知
7.2.3 照片墙功能
美好回忆记录:
- 上传情侣照片
- 按日期排序展示
- 照片描述和标签
八、注意事项
8.1 开发注意事项
-
日期计算:注意时区和夏令时问题
-
状态管理:日期和名字变更需要刷新所有相关页面
-
纪念日排序:添加后需要重新排序
-
空值处理:开始日期未设置时的边界情况
8.2 常见问题
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 天数显示错误 | 时区问题 | 使用本地时间计算 |
| 纪念日未显示 | 日期已过 | 检查日期是否在未来 |
| 名字未更新 | 状态未刷新 | 调用setState |
| 纪念日重复 | 自动生成+手动添加 | 检查ID唯一性 |
8.3 使用提示
💕 恋爱纪念日小贴士 💕
设置正确的恋爱开始日期,让每一天都被记录。
添加重要的纪念日,不错过任何一个特殊时刻。
定期查看纪念日列表,提前准备惊喜。
九、运行说明
9.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
9.2 运行命令
# 查看可用设备
flutter devices
# 运行到Web服务器
flutter run -d web-server -t lib/main_anniversary.dart --web-port 8094
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_anniversary.dart
# 运行到Windows
flutter run -d windows -t lib/main_anniversary.dart
# 代码分析
flutter analyze lib/main_anniversary.dart
十、总结
恋爱纪念日应用通过系统化的纪念日管理功能,为情侣提供了一个记录和追踪恋爱时光的工具。应用支持自定义双方名字、设置恋爱开始日期,自动计算在一起的天数,并生成重要的纪念日提醒。
核心功能涵盖天数统计、纪念日列表、设置管理三大模块。天数统计页面以大字显示在一起的天数,同时展示小时、分钟、秒的分解数据;纪念日列表自动生成周年纪念和特殊天数纪念,用户也可以手动添加自定义纪念日;设置页面支持修改双方名字和恋爱开始日期。
应用采用Material Design 3设计规范,以粉色为主色调,界面浪漫温馨。通过本应用,希望能够帮助情侣记录每一个美好时刻,让爱情更加甜蜜。
记录爱情,珍藏回忆
更多推荐




所有评论(0)