diff --git a/lib/main.dart b/lib/main.dart index 53853ee..c358e6a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,10 +18,9 @@ void main() async{ Hive.registerAdapter(TodoAdapter()); // 打开Box - await Hive.openBox('todos'); + final todosBox = await Hive.openBox('todos'); - final appDir = await getApplicationDocumentsDirectory(); - print('📁 Hive数据库路径: ${appDir.path}'); + todosBox.clear(); runApp(const MyApp()); } diff --git a/lib/models/todo.dart b/lib/models/todo.dart index ce812da..2929301 100644 --- a/lib/models/todo.dart +++ b/lib/models/todo.dart @@ -70,7 +70,7 @@ class Todo extends HiveObject { static Todo getEmpty() { return Todo( - id: 0, + id: DateTime.now().millisecondsSinceEpoch, title: '', content: '', isCompleted: false, diff --git a/lib/models/todo.g.dart b/lib/models/todo.g.dart index 426a7cd..4d29ff3 100644 --- a/lib/models/todo.g.dart +++ b/lib/models/todo.g.dart @@ -17,7 +17,7 @@ class TodoAdapter extends TypeAdapter { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return Todo( - id: fields[0] as int?, + id: fields[0] as int, title: fields[1] as String, content: fields[2] as String, isCompleted: fields[3] as bool, diff --git a/lib/pages/todo_page.dart b/lib/pages/todo_page.dart index c21751c..0315afe 100644 --- a/lib/pages/todo_page.dart +++ b/lib/pages/todo_page.dart @@ -22,17 +22,12 @@ class TodoPage extends StatefulWidget { class TodoPageState extends State { final TodoService todoService = TodoService(); - // 待办事项列表 - late List _todos = []; - - TodoTab _currentTab = TodoTab.all; + late List _todos; + TodoTab _currentTab = TodoTab.active; // 获取过滤后的待办事项 - List get _activeTodos { - return getActiveTodos(_currentTab, _todos); - } + List get _activeTodos => getActiveTodos(_currentTab, _todos); - // 添加一个公共方法供外部调用 void showAddTodoDialog() { _showTodoDialog(false, null); } @@ -40,33 +35,7 @@ class TodoPageState extends State { @override void initState() { super.initState(); - - // _testAddTodo(); - _testQueryTodos(); - } - - void _testQueryTodos() { - try { - _todos = todoService.getAllTodos(); - } catch (e) { - print("失败"); - print(e); - } - } - - Future _testAddTodo() async { - try { - // final newTodo = await todoService.addTodo( - // title: '测试待办事项', - // content: '这是一个测试内容', - // priority: TodoPriority.high, - // dueDate: DateTime.now().add(Duration(days: 3)), - // ); - print("成功"); - } catch (e) { - print("失败"); - print(e); - } + _todos = todoService.getAllTodos(); } @override @@ -96,27 +65,22 @@ class TodoPageState extends State { return _activeTodos.isEmpty ? buildEmptyState(_currentTab) : buildTodoList( - todos: _activeTodos, - onToggleTodo: (todoId) { - setState(() { - _toggleTodo(todoId); - }); - }, - onEditTodo: (todo) { - _showTodoDialog(true, todo); - }, - ); + todos: _activeTodos, + onToggleTodo: (todo) { + setState(() { + _toggleTodo(todo); + }); + }, + onEditTodo: (todo) { + _showTodoDialog(true, todo); + }, + ); } // 切换待办事项完成状态 - void _toggleTodo(String id) { + void _toggleTodo(Todo todo) { setState(() { - final index = _todos.indexWhere((todo) => todo.id.toString() == id); - if (index != -1) { - _todos[index] = _todos[index].copyWith( - isCompleted: !_todos[index].isCompleted, - ); - } + todoService.updateTodoCompletion(todo, !todo.isCompleted); }); } @@ -148,21 +112,22 @@ class TodoPageState extends State { } // 保存待办事项 - void _saveTodo(bool isEditing, Todo todo) { - final store = Provider.of(context, listen: false); + void _saveTodo(bool isEditing, Todo todo) async { + late bool isSuccess ; + if (isEditing) { + isSuccess = await todoService.updateTodo(todo); + } else { + isSuccess = await todoService.addTodo(todo); + } setState(() { - if (isEditing) { - final index = _todos.indexWhere((t) => t.id == todo.id); - if (index != -1) { - _todos[index] = todo; - } - } else { - _todos.insert(0, todo); - } + _todos = todoService.getAllTodos(); }); - store.resetForm(); - showSuccessDialog(context, isEditing ? '更新成功' : '添加成功'); + if (isSuccess) { + showSuccessDialog(context, isEditing ? '更新成功' : '添加成功'); + } else { + showErrorDialog(context, isEditing ? '更新失败' : '添加失败'); + } } } diff --git a/lib/provider/todo_provider.dart b/lib/provider/todo_provider.dart index 5e8edbd..7eafbae 100644 --- a/lib/provider/todo_provider.dart +++ b/lib/provider/todo_provider.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flisp_app/models/todo.dart'; class TodoProvider with ChangeNotifier { - Todo _formItem = Todo.getEmpty(); + late Todo _formItem; Todo get formItem => _formItem; @@ -12,10 +12,7 @@ class TodoProvider with ChangeNotifier { } void initForm(Todo todo) { - _formItem.title = todo.title; - _formItem.content = todo.content ?? ''; - _formItem.dueDate = todo.dueDate; - _formItem.priority = todo.priority; + _formItem = todo; notifyListeners(); } } diff --git a/lib/service/todo_service.dart b/lib/service/todo_service.dart index 2223c72..58b59f4 100644 --- a/lib/service/todo_service.dart +++ b/lib/service/todo_service.dart @@ -6,19 +6,39 @@ class TodoService { Box get box => Hive.box(boxName); - Future addTodo(Todo todo) async { - await box.add(todo); + Future addTodo(Todo todo) async { + try { + await box.add(todo); + return true; + } catch (e) { + return false; + } } List getAllTodos() { return box.values.toList(); } - Future updateTodo(Todo todo) async { - await todo.save(); + Future updateTodo(Todo todo) async { + try { + await todo.save(); + return true; + } catch (e) { + return false; + } } - Future deleteTodo(Todo todo) async { - await todo.delete(); + Future updateTodoCompletion(Todo todo, bool isCompleted) async { + todo.isCompleted = isCompleted; + return await updateTodo(todo); + } + + Future deleteTodo(Todo todo) async { + try { + await todo.delete(); + return true; + } catch (e) { + return false; + } } } diff --git a/lib/widgets/awesome_dialog.dart b/lib/widgets/awesome_dialog.dart index ee49904..06a398d 100644 --- a/lib/widgets/awesome_dialog.dart +++ b/lib/widgets/awesome_dialog.dart @@ -51,4 +51,18 @@ void showSuccessDialog(BuildContext context, String message) { btnOkOnPress: () {}, autoHide: Duration(seconds: 2), ).show(); +} + +// 显示失败提示 +void showErrorDialog(BuildContext context, String message) { + AwesomeDialog( + context: context, + dialogType: DialogType.error, + animType: AnimType.scale, + title: message, + btnOkText: "好的", + btnOkColor: Colors.green, + btnOkOnPress: () {}, + autoHide: Duration(seconds: 2), + ).show(); } \ No newline at end of file diff --git a/lib/widgets/todo_form.dart b/lib/widgets/todo_form.dart index e2830d8..24a096d 100644 --- a/lib/widgets/todo_form.dart +++ b/lib/widgets/todo_form.dart @@ -25,14 +25,6 @@ class _TodoFormState extends State { @override void initState() { super.initState(); - - // 如果是编辑模式,初始化数据 - if (widget.isEditing && widget.initialTodo != null) { - WidgetsBinding.instance.addPostFrameCallback((_) { - final store = Provider.of(context, listen: false); - store.initForm(widget.initialTodo!); - }); - } } @override @@ -201,7 +193,8 @@ class _TodoFormState extends State { : null, ), validator: (value) { - if (value != null && value.isBefore(DateTime.now())) { + if (value != null && + value.isBefore(DateTime.now().subtract(Duration(days: 1)))) { return '不能选择过去的日期'; } return null; diff --git a/lib/widgets/todo_widget.dart b/lib/widgets/todo_widget.dart index 174fb40..2bc6867 100644 --- a/lib/widgets/todo_widget.dart +++ b/lib/widgets/todo_widget.dart @@ -71,7 +71,7 @@ Widget buildTabs({ Widget buildTodoList({ required List todos, - required ValueChanged onToggleTodo, + required ValueChanged onToggleTodo, required ValueChanged onEditTodo, }) { return ListView.separated( @@ -90,7 +90,7 @@ Widget buildTodoList({ Widget _buildTodoItem({ required Todo todo, - required ValueChanged onToggle, + required ValueChanged onToggle, required ValueChanged onEdit, }) { return buildCard( @@ -100,7 +100,7 @@ Widget _buildTodoItem({ width: 24, child: Checkbox( value: todo.isCompleted, - onChanged: (value) => onToggle(todo.id.toString()), + onChanged: (value) => onToggle(todo), materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, ), ),