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

一、项目概述

运行效果图

image-20260405112303980

image-20260405112309321

image-20260405112313790

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 整体架构图

Business Logic

Data Layer

Presentation Layer

主页面
MainPage

首页

纪念日页

设置页

头部信息

天数计数器

下一个纪念日

快速统计

AnniversaryEvent
纪念日模型

开始日期

双方名字

天数计算
_daysTogether

纪念日生成
_generateDefaultEvents

纪念日排序

2.2 类图设计

manages

displays

lists

configures

AnniversaryApp

+Widget build()

AnniversaryEvent

+String id

+String name

+DateTime date

+String? note

+bool isYearly

MainPage

-int _currentIndex

-DateTime? _startDate

-String _partner1Name

-String _partner2Name

-List<AnniversaryEvent> _events

-int get _daysTogether

+Widget build()

-void _setStartDate()

-void _addEvent()

-void _deleteEvent()

HomePage

+DateTime? startDate

+int daysTogether

+String partner1Name

+String partner2Name

+List<AnniversaryEvent> events

+Widget build()

EventsPage

+List<AnniversaryEvent> events

+Function onAdd

+Function onDelete

+Widget build()

SettingsPage

+DateTime? startDate

+Function onDateChanged

+Function onNamesChanged

+Widget build()

2.3 页面导航流程

首页

纪念日

设置

应用启动

主页面

底部导航

首页展示

纪念日列表

设置页面

查看天数统计

查看下一个纪念日

查看即将到来

查看已经过去

添加新纪念日

修改名字

修改开始日期

2.4 数据流向图

数据模型 首页 主页 设置页 用户 数据模型 首页 主页 设置页 用户 设置开始日期 调用onDateChanged 更新_startDate 重新生成纪念日列表 传递daysTogether 计算并显示天数 设置双方名字 调用onNamesChanged 更新名字 刷新显示

三、核心模块设计

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 纪念日分布
渲染错误: Mermaid 渲染失败: Parsing failed: Lexer error on line 4, column 13: unexpected character: ->动<- at offset: 62, skipped 2 characters. Parse error on line 4, column 15: Expecting token of type 'NUMBER_PIE' but found ` `.

3.2 页面结构设计

3.2.1 主页面布局

MainPage

IndexedStack

首页

纪念日页

设置页

NavigationBar

首页 Tab

纪念日 Tab

设置 Tab

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 纪念日生成逻辑

开始日期

生成周年纪念

生成特殊天数

1周年

2周年

...N周年

100天

520天

999天

1314天

合并排序

返回列表


四、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 日期设置流程

主页 DatePicker 设置页 用户 主页 DatePicker 设置页 用户 点击"在一起的日子" 打开日期选择器 选择日期 返回选中日期 调用onDateChanged 更新_startDate 重新生成纪念日

6.2 名字设置流程

点击名字设置

弹出对话框

输入新名字

点击确定?

调用onNamesChanged

关闭对话框

更新状态

刷新首页显示

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 天数计算 纪念日列表 设置功能 数据持久化 提醒功能 照片墙 情侣日记 纪念日礼物推荐 社交分享 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 恋爱纪念日应用开发计划

7.2 功能扩展建议

7.2.1 数据持久化

本地数据存储:

  • 使用SharedPreferences存储配置
  • 使用SQLite存储纪念日数据
  • 支持数据导入导出
7.2.2 提醒功能

纪念日提醒:

  • 提前1天/3天/7天提醒
  • 自定义提醒时间
  • 推送通知
7.2.3 照片墙功能

美好回忆记录:

  • 上传情侣照片
  • 按日期排序展示
  • 照片描述和标签

八、注意事项

8.1 开发注意事项

  1. 日期计算:注意时区和夏令时问题

  2. 状态管理:日期和名字变更需要刷新所有相关页面

  3. 纪念日排序:添加后需要重新排序

  4. 空值处理:开始日期未设置时的边界情况

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设计规范,以粉色为主色调,界面浪漫温馨。通过本应用,希望能够帮助情侣记录每一个美好时刻,让爱情更加甜蜜。

记录爱情,珍藏回忆


Logo

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

更多推荐