import 'package:flutter/material.dart'; import '../model/callback_models/create_task_request.dart'; 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 { static const String routeName = '/'; const TaskOverviewPage({super.key}); @override State createState() => _TaskOverviewPageState(); } class _TaskOverviewPageState extends State { List get tasks => context.controller().orderedTasks; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(), body: Padding( padding: EdgeInsetsGeometry.symmetric( horizontal: MediaQuery.of(context).size.width * 0.05, ), child: ReorderableListView.builder( itemBuilder: itemBuilder, itemCount: tasks.length, onReorderItem: context.controller().reorderTask, ), ), floatingActionButton: FloatingActionButton( onPressed: onCreateTaskTapped, child: Icon(Icons.add), ), ); } Widget itemBuilder(BuildContext context, int index) { final task = tasks.elementAt(index); return Padding( key: Key(task.id), padding: const EdgeInsets.only(bottom: 12), child: TaskDismissible( key: Key(task.id), 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), ); } }, ), ), ); } Future onTaskTapped(Task task) async { final result = await Navigator.of( context, ).pushNamed(TaskEditPage.routeName, arguments: task); return result as CreateTaskRequest?; } void onCreateTaskTapped() async { final result = await Navigator.of(context).pushNamed(TaskEditPage.routeName) as CreateTaskRequest?; if (result != null && context.mounted) { context.controller().saveTask( result.toTask(id: generateId()), ); } } }