待办清单任务管理提醒应用
欢迎加入开源鸿蒙跨平台社区:
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
一、项目概述
运行效果图
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 / iOS API 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 整体架构图
2.2 类图设计
+readAllTodos() : List<Todo>
+deleteAllCompleted() : int
+getTodosWithReminders() : List<Todo>
+getOverdueTodos() : List<Todo>
+getTodayTodos() : List<Todo>
+instance NotificationService
+requestPermissions() : void
+scheduleTodoReminder(Todo) : void
+cancelReminder(int) : void
+cancelAllReminders() : void
+showImmediateNotification() : void
+getPendingNotifications() : List
+showTodoCompletedNotification(Todo) : void
+showOverdueNotification(Todo) : void
-TabController _tabController
-String _selectedCategory
+_toggleTodo(Todo) : void
+_deleteTodo(Todo) : void
+_showAddTodoDialog() : void
+_showEditTodoDialog(Todo) : void
+_clearCompleted() : void
-TextEditingController _titleController
-TextEditingController _descriptionController
+_selectDateTime() : void
2.3 数据流程图
三、核心功能实现
3.1 数据库设计
3.1.1 数据表结构
todos 表(任务表)
字段名 类型 约束 说明 id INTEGER PRIMARY KEY AUTOINCREMENT 任务ID title TEXT NOT NULL 任务标题 description TEXT - 任务描述 createdAt TEXT NOT NULL 创建时间 reminderTime TEXT - 提醒时间 dueDate TEXT - 截止日期 priority INTEGER DEFAULT 1 优先级(1-3) isCompleted INTEGER DEFAULT 0 是否完成(0/1) category TEXT DEFAULT ‘默认’ 任务分类
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 智能属性
属性名 返回类型 功能说明 priorityLabel String 获取优先级文字描述 priorityEmoji String 获取优先级表情符号 categoryEmoji String 获取分类表情符号 isOverdue bool 判断任务是否过期 isDueToday bool 判断任务是否今天到期 isDueTomorrow bool 判断任务是否明天到期 dueDateLabel String 获取截止日期友好显示
四、界面设计
4.1 主页面布局
4.2 任务卡片设计
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 数据库版本 表数量 1 todos 表 存储位置 应用沙盒目录 getDatabasesPath()
6.1.2 CRUD 操作
操作 方法名 参数 返回值 创建 create Todo int (ID) 读取单个 readTodo int (ID) Todo 读取全部 readAllTodos - List<Todo> 更新 update Todo int (影响行数) 删除 delete int (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 卡片出现 FadeIn 200ms 复选框切换 缩放动画 150ms 删除卡片 SlideOut 200ms 对话框弹出 Scale + Fade 250ms
八、性能优化
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 Android API 21+ iOS iOS 12.0+ 鸿蒙OS HarmonyOS 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 本地数据存储和通知服务的优秀案例,涵盖了:
sqflite 数据库 的完整 CRUD 操作flutter_local_notifications 的定时通知调度Material Design 3 的设计规范应用表单验证 和用户输入处理 日期时间选择器 的使用列表渲染 和状态管理 错误处理 和用户反馈
所有评论(0)