feat:增加提醒事项

This commit is contained in:
2025-11-08 22:06:16 +08:00
parent 27f0638c01
commit d5ff4c9b02
30 changed files with 1490 additions and 199 deletions

View File

@@ -1,25 +1,42 @@
import 'package:flisp_app/widgets/common.dart';
import 'package:flutter/material.dart';
import 'package:flutter_quill/flutter_quill.dart';
class FlashPage extends StatelessWidget {
class FlashPage extends StatefulWidget {
const FlashPage({super.key});
@override
_FlashPageState createState() => _FlashPageState();
}
class _FlashPageState extends State<FlashPage> {
late QuillController _controller;
@override
void initState() {
super.initState();
_controller = QuillController.basic();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return buildBody(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.flash_on, size: 80, color: Colors.blue),
SizedBox(height: 20),
Text(
'闪灵',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
QuillSimpleToolbar(
controller: _controller,
config: const QuillSimpleToolbarConfig(),
),
SizedBox(height: 10),
Text(
'快速记录你的灵感瞬间',
style: TextStyle(fontSize: 16, color: Colors.grey),
Expanded(
child: QuillEditor.basic(
controller: _controller,
config: const QuillEditorConfig(),
),
),
],
),

View File

@@ -1,28 +0,0 @@
import 'package:flisp_app/widgets/common.dart';
import 'package:flutter/material.dart';
class NotesPage extends StatelessWidget {
const NotesPage({super.key});
@override
Widget build(BuildContext context) {
return buildBody(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.note, size: 80, color: Colors.green),
SizedBox(height: 20),
Text(
'笔记',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 10),
Text(
'管理你的所有笔记',
style: TextStyle(fontSize: 16, color: Colors.grey),
),
],
),
);
}
}

View File

@@ -1,28 +1,171 @@
import 'package:flisp_app/widgets/common.dart';
import 'package:flisp_app/models/reminder.dart';
import 'package:flisp_app/provider/reminder_provider.dart';
import 'package:flisp_app/service/reminder_service.dart';
import 'package:flisp_app/utils/notify_utils.dart';
import 'package:flisp_app/widgets/awesome_dialog.dart';
import 'package:flisp_app/widgets/reminder_form.dart';
import 'package:flisp_app/widgets/reminder_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
import 'package:provider/provider.dart';
import 'package:flisp_app/widgets/common.dart';
class RemindersPage extends StatelessWidget {
const RemindersPage({super.key});
class RemindersPage extends StatefulWidget {
final VoidCallback? onAddPressed;
const RemindersPage({super.key, this.onAddPressed});
@override
State<RemindersPage> createState() => ReminderPageState();
}
class ReminderPageState extends State<RemindersPage> {
final ReminderService reminderService = ReminderService();
final NotifyService notifyService = NotifyService();
List<Reminder> _reminders = [];
void showAddDialog() {
_showDialog(false, null);
}
@override
void initState() {
super.initState();
_loadReminders();
}
Future<void> _loadReminders() async {
final reminders = await updateReminders();
if (mounted) {
setState(() {
_reminders = reminders;
});
}
}
Future<List<Reminder>> updateReminders() async {
// 获取flutter_local_notifications中所有的通知ID
final pendingNotifications = await notifyService.getPendingNotifications();
print("notifyService: ${pendingNotifications.length}");
final notificationIds = pendingNotifications.map((n) => n.id).toSet();
// 获取Hive中所有的提醒
final hiveReminders = reminderService.getAllReminders();
print("hiveReminders: ${hiveReminders.length}");
final hiveReminderIds = hiveReminders.map((r) => r.id).toSet();
// 情况1删除Hive中存在但通知中不存在的提醒已触发或已取消
final remindersToDeleteFromHive =
hiveReminders.where((reminder) {
return !notificationIds.contains(reminder.id);
}).toList();
for (final reminder in remindersToDeleteFromHive) {
await reminderService.deleteReminder(reminder);
}
// 情况2对于通知中存在但Hive中不存在的提醒重新创建保留时间等完整信息
final remindersToRecreate =
pendingNotifications.where((notification) {
return !hiveReminderIds.contains(notification.id);
}).toList();
for (final notification in remindersToRecreate) {
final newReminder = Reminder(
id: notification.id,
title: notification.title ?? '新提醒',
content: notification.body ?? '',
scheduledTime: DateTime.now().add(const Duration(days: 1)),
);
await reminderService.addReminder(newReminder);
}
// 更新本地列表
_reminders = reminderService.getAllReminders();
return _reminders;
}
@override
Widget build(BuildContext context) {
return buildBody(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.notifications, size: 80, color: Colors.red),
SizedBox(height: 20),
Text(
'提醒任务',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 10),
Text(
'设置重要提醒',
style: TextStyle(fontSize: 16, color: Colors.grey),
Expanded(
child: buildReminderList(
reminders: _reminders,
onEditReminder: (reminder) {
_showDialog(true, reminder);
},
),
),
],
),
);
}
}
// 显示对话框
void _showDialog(bool isEditing, Reminder? reminder) {
final reminderProvider = Provider.of<ReminderProvider>(
context,
listen: false,
);
if (isEditing) {
reminderProvider.initForm(reminder!);
} else {
reminderProvider.resetForm();
}
final formKey = GlobalKey<FormBuilderState>();
showAwesomeDialog(
context: context,
body: ReminderForm(
formKey: formKey,
isEditing: isEditing,
initialReminder: reminder,
),
onOk: () {
if (formKey.currentState!.saveAndValidate()) {
Navigator.of(context).pop();
_saveOrUpdateReminder(isEditing, reminderProvider.formItem);
}
},
onCancel: () {
reminderProvider.resetForm();
},
);
}
// 保存提醒事项
void _saveOrUpdateReminder(bool isEditing, Reminder reminder) async {
late bool isSuccess;
if (isEditing) {
// 先删除
await notifyService.cancelNotification(reminder.id);
await reminderService.deleteReminder(reminder);
// 在重新新建
reminder.id = DateTime.now().millisecondsSinceEpoch ~/ 1000;
}
isSuccess = await reminderService.addReminder(reminder);
await notifyService.scheduleNotification(
id: reminder.id,
title: reminder.title,
body: reminder.content,
scheduledTime: reminder.scheduledTime,
);
await _loadReminders();
if (isSuccess) {
showSuccessDialog(context, isEditing ? '更新成功' : '添加成功');
} else {
showErrorDialog(context, isEditing ? '更新失败' : '添加失败');
}
}
}

View File

@@ -28,8 +28,8 @@ class TodoPageState extends State<TodoPage> {
// 获取过滤后的待办事项
List<Todo> get _activeTodos => getActiveTodos(_currentTab, _todos);
void showAddTodoDialog() {
_showTodoDialog(false, null);
void showAddDialog() {
_showDialog(false, null);
}
@override
@@ -65,16 +65,16 @@ class TodoPageState extends State<TodoPage> {
return _activeTodos.isEmpty
? buildEmptyState(_currentTab)
: buildTodoList(
todos: _activeTodos,
onToggleTodo: (todo) {
setState(() {
_toggleTodo(todo);
});
},
onEditTodo: (todo) {
_showTodoDialog(true, todo);
},
);
todos: _activeTodos,
onToggleTodo: (todo) {
setState(() {
_toggleTodo(todo);
});
},
onEditTodo: (todo) {
_showDialog(true, todo);
},
);
}
// 切换待办事项完成状态
@@ -85,7 +85,7 @@ class TodoPageState extends State<TodoPage> {
}
// 显示对话框
void _showTodoDialog(bool isEditing, Todo? todo) {
void _showDialog(bool isEditing, Todo? todo) {
final todoProvider = Provider.of<TodoProvider>(context, listen: false);
if (isEditing) {
@@ -113,7 +113,7 @@ class TodoPageState extends State<TodoPage> {
// 保存待办事项
void _saveTodo(bool isEditing, Todo todo) async {
late bool isSuccess ;
late bool isSuccess;
if (isEditing) {
isSuccess = await todoService.updateTodo(todo);
} else {