import 'package:flutter/material.dart' show ChangeNotifier; import '../../model/repositories/interfaces/task_repository.dart'; import '../../model/task.dart'; class TaskController extends ChangeNotifier { TaskController(TaskRepository repository) : _repository = repository { Future.wait([ _loadTaskOrder(), _loadTasks(), ]).whenComplete(() => notifyListeners()); } final TaskRepository _repository; final List _tasks = []; final List _taskOrder = []; List get orderedTasks { final lookup = {for (final task in _tasks) task.id: task}; return _taskOrder.map((id) => lookup[id]!).toList(); } Future reorderTask(int oldIndex, int newIndex) async { final taskId = _taskOrder.removeAt(oldIndex); _taskOrder.insert(newIndex, taskId); _repository.updateTaskOrder(_taskOrder); } Future saveTask(Task task) async { if (_tasks.contains(task)) { _tasks.remove(task); _tasks.add(task); _repository.updateTask(task); } else { _tasks.add(task); _taskOrder.add(task.id); _repository.createTask(task); _repository.updateTaskOrder(_taskOrder); } notifyListeners(); } Future deleteTask(Task task) async { _tasks.remove(task); _taskOrder.remove(task.id); notifyListeners(); _repository.deleteTask(task); _repository.updateTaskOrder(_taskOrder); } Future _loadTasks() async { _tasks.clear(); return _repository.loadTasks().then((value) => _tasks.addAll(value)); } Future _loadTaskOrder() async { _taskOrder.clear(); return _repository.loadTaskOrder().then( (value) => _taskOrder.addAll(value), ); } }