待办清单任务管理提醒应用


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

适配的第三方库地址:

  • sqflite: https://pub.dev/packages/sqflite
  • flutter_local_notifications: https://pub.dev/packages/flutter_local_notifications
  • timezone: https://pub.dev/packages/timezone

一、项目概述

运行效果图

image-20260411214231057

image-20260411214319476

image-20260411214409499

image-20260411214415461

1.1 应用简介

待办清单任务管理提醒应用是一款高效实用的个人任务管理工具,帮助用户轻松管理日常任务、设置提醒、追踪进度。应用采用现代化的 Material Design 3 设计风格,支持任务分类、优先级设置、截止日期提醒等功能,让任务管理变得井井有条。

应用以优雅的紫色为主色调,象征专注与效率。涵盖任务管理、提醒通知、统计分析三大核心模块。用户可以创建任务、设置提醒时间、添加截止日期、标记完成状态,并通过直观的统计面板了解任务完成情况。

1.2 核心功能

功能模块功能描述实现方式
任务管理创建、编辑、删除任务sqflite 数据库
提醒通知定时提醒用户完成任务flutter_local_notifications
任务分类按工作、学习、生活等分类管理分类标签系统
优先级设置高、中、低三级优先级优先级标识
截止日期设置任务截止时间并提醒日期时间选择器
统计分析查看任务完成率和统计数据数据可视化
过期提醒自动识别过期任务并高亮显示智能判断
批量操作批量删除已完成任务批量处理

1.3 任务分类定义

序号分类名称Emoji描述适用场景
1工作💼工作相关任务会议、项目、报告
2学习📚学习相关任务课程、作业、考试
3生活🏠生活日常任务购物、缴费、预约
4健康💪健康相关任务运动、体检、用药
5娱乐🎮娱乐休闲任务游戏、电影、旅行
6默认📋默认分类其他类型任务

1.4 优先级等级定义

序号优先级名称Emoji颜色标识描述
1低优先级🟢绿色不紧急的任务
2中优先级🟡黄色需要关注的任务
3高优先级🔴红色紧急重要的任务

1.5 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
数据存储sqflite^2.4.1
通知服务flutter_local_notifications^18.0.1
时区处理timezone^0.10.0
状态管理StatefulWidget-
目标平台鸿蒙OS / Android / iOSAPI 21+

1.6 项目结构

lib/
├── main_todo.dart                    # 应用入口
│   ├── TodoApp                       # 应用配置
│   ├── TodoHomePage                  # 主页面(TabBar)
│   ├── _TodoHomePageState            # 主页面状态管理
│   ├── AddTodoDialog                 # 添加/编辑任务对话框
│   └── _AddTodoDialogState           # 对话框状态管理
├── models/
│   └── todo.dart                     # 任务数据模型
│       └── Todo                      # 任务实体类
└── services/
    ├── database_helper.dart          # 数据库服务
    │   └── DatabaseHelper            # SQLite 数据库帮助类
    └── notification_service.dart     # 通知服务
        └── NotificationService       # 本地通知服务类

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
TodoHomePage

待办列表

已完成列表

统计页面

任务卡片

添加任务对话框

任务详情

任务操作

表单输入

日期选择

分类选择

数据库服务
DatabaseHelper

通知服务
NotificationService

Todo
任务模型

SQLite
本地数据库

Notification
通知系统

2.2 类图设计

Todo

+int? id

+String title

+String description

+DateTime createdAt

+DateTime? reminderTime

+DateTime? dueDate

+int priority

+bool isCompleted

+String category

+priorityLabel String

+priorityEmoji String

+categoryEmoji String

+isOverdue bool

+isDueToday bool

+isDueTomorrow bool

+dueDateLabel String

+toMap() : Map

+fromMap(Map) : Todo

+copyWith() : Todo

DatabaseHelper

+instance DatabaseHelper

+database Database

+create(Todo) : int

+readTodo(int) : Todo

+readAllTodos() : List<Todo>

+update(Todo) : int

+delete(int) : int

+deleteAllCompleted() : int

+getTodosWithReminders() : List<Todo>

+getOverdueTodos() : List<Todo>

+getTodayTodos() : List<Todo>

+getStatistics() : Map

NotificationService

+instance NotificationService

+initialize() : void

+requestPermissions() : void

+scheduleTodoReminder(Todo) : void

+cancelReminder(int) : void

+cancelAllReminders() : void

+showImmediateNotification() : void

+getPendingNotifications() : List

+showTodoCompletedNotification(Todo) : void

+showOverdueNotification(Todo) : void

TodoHomePage

-TabController _tabController

-List<Todo> _todos

-Map _statistics

-bool _isLoading

-String _selectedCategory

+_loadTodos() : void

+_toggleTodo(Todo) : void

+_deleteTodo(Todo) : void

+_showAddTodoDialog() : void

+_showEditTodoDialog(Todo) : void

+_clearCompleted() : void

AddTodoDialog

-GlobalKey _formKey

-TextEditingController _titleController

-TextEditingController _descriptionController

-DateTime? _reminderTime

-DateTime? _dueDate

-int _priority

-String _category

+_selectDateTime() : void

+_submit() : void

2.3 数据流程图

添加任务

编辑任务

完成任务

删除任务

用户操作

操作类型

打开添加对话框

填写任务信息

保存到数据库

是否设置提醒

调度通知

刷新列表

打开编辑对话框

修改任务信息

更新数据库

是否修改提醒

重新调度通知

切换完成状态

更新数据库

是否已完成

取消提醒

重新调度提醒

确认删除

从数据库删除

取消相关通知


三、核心功能实现

3.1 数据库设计

3.1.1 数据表结构

todos 表(任务表)

字段名类型约束说明
idINTEGERPRIMARY KEY AUTOINCREMENT任务ID
titleTEXTNOT NULL任务标题
descriptionTEXT-任务描述
createdAtTEXTNOT NULL创建时间
reminderTimeTEXT-提醒时间
dueDateTEXT-截止日期
priorityINTEGERDEFAULT 1优先级(1-3)
isCompletedINTEGERDEFAULT 0是否完成(0/1)
categoryTEXTDEFAULT ‘默认’任务分类
3.1.2 数据库初始化
Future<Database> _initDB(String filePath) async {
  final dbPath = await getDatabasesPath();
  final path = join(dbPath, filePath);

  return await openDatabase(
    path,
    version: 1,
    onCreate: _createDB,
  );
}

Future _createDB(Database db, int version) async {
  await db.execute('''
    CREATE TABLE todos (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      title TEXT NOT NULL,
      description TEXT,
      createdAt TEXT NOT NULL,
      reminderTime TEXT,
      dueDate TEXT,
      priority INTEGER DEFAULT 1,
      isCompleted INTEGER DEFAULT 0,
      category TEXT DEFAULT '默认'
    )
  ''');
}

3.2 通知服务实现

3.2.1 通知初始化
Future<void> initialize() async {
  tz.initializeTimeZones();

  const AndroidInitializationSettings androidSettings =
      AndroidInitializationSettings('@mipmap/ic_launcher');

  const DarwinInitializationSettings iosSettings =
      DarwinInitializationSettings(
    requestAlertPermission: true,
    requestBadgePermission: true,
    requestSoundPermission: true,
  );

  const InitializationSettings settings = InitializationSettings(
    android: androidSettings,
    iOS: iosSettings,
  );

  await _notifications.initialize(
    settings,
    onDidReceiveNotificationResponse: _onNotificationTapped,
  );
}
3.2.2 调度提醒通知
Future<void> scheduleTodoReminder(Todo todo) async {
  if (todo.reminderTime == null || todo.id == null) return;

  final scheduledDate = tz.TZDateTime.from(
    todo.reminderTime!,
    tz.local,
  );

  await _notifications.zonedSchedule(
    todo.id!,
    '待办提醒',
    '${todo.priorityEmoji} ${todo.title}',
    scheduledDate,
    NotificationDetails(
      android: AndroidNotificationDetails(
        'todo_reminders',
        '待办提醒',
        channelDescription: '待办事项提醒通知',
        importance: Importance.high,
        priority: Priority.high,
      ),
      iOS: const DarwinNotificationDetails(
        presentAlert: true,
        presentBadge: true,
        presentSound: true,
      ),
    ),
    androidScheduleMode: AndroidScheduleMode.exactAllowWhileIdle,
    uiLocalNotificationDateInterpretation:
        UILocalNotificationDateInterpretation.absoluteTime,
  );
}

3.3 任务模型设计

3.3.1 模型属性
class Todo {
  final int? id;
  final String title;
  final String description;
  final DateTime createdAt;
  final DateTime? reminderTime;
  final DateTime? dueDate;
  final int priority;
  final bool isCompleted;
  final String category;
}
3.3.2 智能属性
属性名返回类型功能说明
priorityLabelString获取优先级文字描述
priorityEmojiString获取优先级表情符号
categoryEmojiString获取分类表情符号
isOverduebool判断任务是否过期
isDueTodaybool判断任务是否今天到期
isDueTomorrowbool判断任务是否明天到期
dueDateLabelString获取截止日期友好显示

四、界面设计

4.1 主页面布局

主页面结构

AppBar

标题: 待办清单

TabBar: 待办/已完成/统计

筛选菜单

清除已完成按钮

TabBarView

待办列表

已完成列表

统计页面

FloatingActionButton

添加任务

4.2 任务卡片设计

任务卡片

Checkbox

任务信息

标题

描述

标签组

优先级

截止日期

提醒时间

分类

删除按钮

4.3 添加任务对话框

对话框结构

标题输入框

描述输入框

分类下拉框

优先级下拉框

提醒时间选择

截止日期选择

取消/添加按钮

4.4 统计页面设计

统计页面

任务概览卡片

总任务数

已完成数

待完成数

已过期数

完成率卡片

进度条

百分比显示

分类统计卡片

各分类任务数量


五、功能详解

5.1 任务管理功能

5.1.1 创建任务
通知服务数据库界面用户通知服务数据库界面用户alt[设置了提醒时间]点击添加按钮显示添加对话框填写任务信息点击添加保存任务到数据库返回任务ID调度提醒通知调度成功刷新任务列表显示成功提示
5.1.2 编辑任务
通知服务数据库界面用户通知服务数据库界面用户alt[修改了提醒时间][取消了提醒]点击任务卡片显示编辑对话框修改任务信息点击保存更新任务到数据库更新成功重新调度通知取消通知刷新任务列表显示更新提示
5.1.3 完成任务
通知服务数据库界面用户通知服务数据库界面用户alt[有提醒时间]alt[标记为完成][标记为未完成]点击复选框更新完成状态更新成功取消提醒通知显示完成通知重新调度通知刷新任务列表

5.2 提醒通知功能

5.2.1 通知调度流程

有效

无效

用户设置提醒时间

时间是否有效

创建定时通知

提示错误

保存到系统通知队列

到达提醒时间

触发通知

继续等待

显示通知横幅

播放提示音

震动提醒

用户点击通知

打开应用

5.2.2 通知类型
通知类型触发条件通知内容优先级
提醒通知到达设置的提醒时间任务标题和优先级
完成通知标记任务为完成任务完成提示普通
过期通知任务超过截止日期过期警告提示

5.3 统计分析功能

5.3.1 统计指标
指标名称计算方式显示方式
总任务数COUNT(*)数字卡片
已完成数COUNT(isCompleted=1)数字卡片
待完成数COUNT(isCompleted=0)数字卡片
已过期数COUNT(dueDate < now AND isCompleted=0)数字卡片
完成率已完成数 / 总任务数 × 100%进度条 + 百分比
分类统计GROUP BY category列表显示
5.3.2 统计查询实现
Future<Map<String, int>> getStatistics() async {
  final db = await instance.database;

  final total = Sqflite.firstIntValue(
    await db.rawQuery('SELECT COUNT(*) FROM todos'),
  );

  final completed = Sqflite.firstIntValue(
    await db.rawQuery('SELECT COUNT(*) FROM todos WHERE isCompleted = 1'),
  );

  final pending = Sqflite.firstIntValue(
    await db.rawQuery('SELECT COUNT(*) FROM todos WHERE isCompleted = 0'),
  );

  final overdue = Sqflite.firstIntValue(
    await db.rawQuery(
      'SELECT COUNT(*) FROM todos WHERE dueDate IS NOT NULL AND isCompleted = 0 AND dueDate < ?',
      [DateTime.now().toIso8601String()],
    ),
  );

  return {
    'total': total ?? 0,
    'completed': completed ?? 0,
    'pending': pending ?? 0,
    'overdue': overdue ?? 0,
  };
}

六、数据持久化

6.1 SQLite 数据库

6.1.1 数据库配置
配置项配置值说明
数据库名todo_app.db数据库文件名
版本号1数据库版本
表数量1todos 表
存储位置应用沙盒目录getDatabasesPath()
6.1.2 CRUD 操作
操作方法名参数返回值
创建createTodoint (ID)
读取单个readTodoint (ID)Todo
读取全部readAllTodos-List<Todo>
更新updateTodoint (影响行数)
删除deleteint (ID)int (影响行数)
批量删除deleteAllCompleted-int (影响行数)

6.2 数据模型转换

6.2.1 对象转Map
Map<String, dynamic> toMap() {
  return {
    'id': id,
    'title': title,
    'description': description,
    'createdAt': createdAt.toIso8601String(),
    'reminderTime': reminderTime?.toIso8601String(),
    'dueDate': dueDate?.toIso8601String(),
    'priority': priority,
    'isCompleted': isCompleted ? 1 : 0,
    'category': category,
  };
}
6.2.2 Map转对象
factory Todo.fromMap(Map<String, dynamic> map) {
  return Todo(
    id: map['id'] as int?,
    title: map['title'] as String,
    description: map['description'] as String? ?? '',
    createdAt: DateTime.parse(map['createdAt'] as String),
    reminderTime: map['reminderTime'] != null
        ? DateTime.parse(map['reminderTime'] as String)
        : null,
    dueDate: map['dueDate'] != null
        ? DateTime.parse(map['dueDate'] as String)
        : null,
    priority: map['priority'] as int? ?? 1,
    isCompleted: (map['isCompleted'] as int? ?? 0) == 1,
    category: map['category'] as String? ?? '默认',
  );
}

七、用户交互设计

7.1 手势操作

操作手势功能
查看详情点击任务卡片打开编辑对话框
完成任务点击复选框切换完成状态
删除任务点击删除图标删除任务
添加任务点击浮动按钮打开添加对话框
筛选分类点击筛选图标选择分类筛选
清除已完成点击清除图标批量删除已完成任务

7.2 反馈机制

操作反馈方式持续时间
添加成功SnackBar 提示2秒
更新成功SnackBar 提示2秒
删除成功SnackBar + 撤销按钮4秒
操作失败SnackBar 错误提示3秒
提醒触发系统通知 + 震动用户操作后消失

7.3 动画效果

场景动画类型持续时间
页面切换TabBarView 滑动300ms
卡片出现FadeIn200ms
复选框切换缩放动画150ms
删除卡片SlideOut200ms
对话框弹出Scale + Fade250ms

八、性能优化

8.1 数据库优化

优化项实现方式效果
单例模式DatabaseHelper.instance避免重复创建连接
异步操作Future/async-await不阻塞UI线程
批量查询单次查询获取全部数据减少数据库访问次数
索引优化主键自动索引加快查询速度

8.2 UI优化

优化项实现方式效果
列表懒加载ListView.builder按需渲染列表项
状态管理setState 局部刷新减少不必要的重建
图片缓存使用系统图标无需额外缓存
动画优化AnimatedSwitcher平滑过渡效果

8.3 内存管理

优化项实现方式效果
控制器释放dispose() 方法防止内存泄漏
流订阅取消自动管理避免资源浪费
对象复用copyWith 方法减少对象创建

九、错误处理

9.1 数据库错误

错误类型处理方式用户提示
数据库打开失败捕获异常,返回空列表“加载数据失败”
插入失败捕获异常,记录日志“添加任务失败”
更新失败捕获异常,记录日志“更新任务失败”
删除失败捕获异常,记录日志“删除任务失败”

9.2 通知错误

错误类型处理方式用户提示
权限未授予引导用户开启权限“请开启通知权限”
调度失败记录日志,不影响任务保存无提示
时区错误使用默认时区无提示

9.3 输入验证

验证项验证规则错误提示
任务标题非空,去除首尾空格“请输入任务标题”
提醒时间必须大于当前时间无(自动过滤)
截止日期必须大于当前时间无(自动过滤)

十、扩展功能

10.1 未来规划

功能优先级预计实现
任务搜索下个版本
任务标签下个版本
子任务未来版本
任务重复未来版本
数据同步未来版本
主题切换未来版本
小组件未来版本
语音输入未来版本

10.2 技术演进

当前版本v1.0基础任务管理v1.0本地数据库存储v1.0本地通知提醒下个版本v1.1任务搜索功能v1.1标签系统v1.1主题切换未来版本v2.0云端同步v2.0多设备支持v2.0协作功能技术演进路线图

十一、部署说明

11.1 环境要求

环境要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
AndroidAPI 21+
iOSiOS 12.0+
鸿蒙OSHarmonyOS 3.0+

11.2 依赖安装

flutter pub get

11.3 运行应用

flutter run -t lib/main_todo.dart

11.4 权限配置

Android (android/app/src/main/AndroidManifest.xml):

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

iOS (ios/Runner/Info.plist):

<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string>
</array>

十二、总结

待办清单任务管理提醒应用是一款功能完善、设计优雅的个人任务管理工具。通过 sqflite 实现数据的本地持久化存储,通过 flutter_local_notifications 实现精准的定时提醒功能。应用采用 Material Design 3 设计规范,界面简洁美观,交互流畅自然。

12.1 核心优势

优势说明
🎯 功能完整涵盖任务创建、编辑、删除、完成等全流程管理
💾 数据持久使用 SQLite 数据库,数据安全可靠
智能提醒支持自定义提醒时间,准时推送通知
📊 统计分析直观展示任务完成情况,帮助提升效率
🎨 界面优雅Material Design 3 设计,视觉体验出色
📱 跨平台支持 Android、iOS、鸿蒙OS 多平台运行

12.2 技术亮点

  • 单例模式:数据库和通知服务采用单例设计,避免资源浪费
  • 异步编程:全面使用 Future 和 async-await,确保UI流畅
  • 模型封装:Todo 模型包含丰富的计算属性,简化业务逻辑
  • 错误处理:完善的异常捕获机制,提升应用稳定性
  • 状态管理:合理使用 StatefulWidget,实现高效的局部刷新

12.3 学习价值

本项目是学习 Flutter 本地数据存储和通知服务的优秀案例,涵盖了:

  1. sqflite 数据库的完整 CRUD 操作
  2. flutter_local_notifications 的定时通知调度
  3. Material Design 3 的设计规范应用
  4. 表单验证用户输入处理
  5. 日期时间选择器的使用
  6. 列表渲染状态管理
  7. 错误处理用户反馈

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐