diff --git a/lib/pages/task_overview_page.dart b/lib/pages/task_overview_page.dart index 182a814..9f26226 100644 --- a/lib/pages/task_overview_page.dart +++ b/lib/pages/task_overview_page.dart @@ -5,6 +5,7 @@ import '../model/extensions/controller_context.dart'; import '../model/task.dart'; import '../service/controllers/task_controller.dart'; import '../service/tools.dart'; +import '../widgets/task_dismissible.dart'; import 'task_edit_page.dart'; class TaskOverviewPage extends StatefulWidget { @@ -37,24 +38,28 @@ class _TaskOverviewPageState extends State { Widget itemBuilder(BuildContext context, int index) { final task = tasks.elementAt(index); - return ListTile( + return TaskDismissible( key: Key(task.id), - title: Text(task.title), - subtitle: task.description.isNotEmpty ? Text(task.description) : null, - trailing: Checkbox( - value: task.isCompleted, - onChanged: (isCompleted) => context - .controller() - .saveTask(task.copyWith(isCompleted: isCompleted)), + onDismissedRight: () => + context.controller().deleteTask(task), + child: ListTile( + title: Text(task.title), + subtitle: task.description.isNotEmpty ? Text(task.description) : null, + trailing: Checkbox( + value: task.isCompleted, + onChanged: (isCompleted) => context + .controller() + .saveTask(task.copyWith(isCompleted: isCompleted)), + ), + onTap: () async { + final result = await onTaskTapped(task); + if (result != null && context.mounted) { + context.controller().saveTask( + result.toTask(id: task.id), + ); + } + }, ), - onTap: () async { - final result = await onTaskTapped(task); - if (result != null && context.mounted) { - context.controller().saveTask( - result.toTask(id: task.id), - ); - } - }, ); } diff --git a/lib/widgets/task_dismissible.dart b/lib/widgets/task_dismissible.dart new file mode 100644 index 0000000..5df9a80 --- /dev/null +++ b/lib/widgets/task_dismissible.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class TaskDismissible extends StatelessWidget { + const TaskDismissible({ + required super.key, + this.onDismissedRight, + required this.child, + }); + + final VoidCallback? onDismissedRight; + final Widget child; + + @override + Widget build(BuildContext context) { + return Dismissible( + key: key!, + direction: DismissDirection.startToEnd, + background: Container( + color: Theme.of(context).colorScheme.error, + child: Align( + alignment: AlignmentGeometry.centerLeft, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Icon( + Icons.delete, + color: Theme.of(context).colorScheme.onError, + ), + ), + ), + ), + onDismissed: onDismissed, + child: child, + ); + } + + void onDismissed(DismissDirection direction) { + if (direction == DismissDirection.startToEnd && onDismissedRight != null) { + onDismissedRight!(); + } + } +}