Use my flutter page to meet the requirements i'll send you. DO the necessary changes: Neste trabalho vamos acrescentar duas animações na lista de tarefas:
Ao concluir uma tarefa, ela deve deslizar por sobre a lista de tarefas (8 pontos)
Uma opção simples é usar um Stack e um AnimatedPositioned
Pode usar as classes do tutorial de animação da aula de hoje.
Pode (deve!) usar a classe AnimatedList.
A tarefa concluída deve fazer um "tilt" ao ir para a posição, como se estivesse caindo um lado primeiro (inclinar e depois alinhar horizontalmente de novo). (2 pontos)
Essas animações devem ser feitas apenas ao concluir uma tarefa.
Não é necessário fazer a animação ao "desconcluir" uma tarefa (embora seja fácil...)
Não altere o comportamento do "deletar tarefa" (continua o desfazer com 3 segundos)
Se você colocou um "desfazer" de três segundos no concluir tarefa, tire - vai atrapalhar a animação!
Implemente o desconcluir tarefa! Deve apenas mover a tarefa para o final da lista de tarefas não concluída.  code: class TaskListPage extends StatefulWidget {
  final String token;
  final String email;

  const TaskListPage({required this.token, required this.email});

  @override
  _TaskListPageState createState() => _TaskListPageState();
}

class _TaskListPageState extends State<TaskListPage> {
  final List<Map<String, dynamic>> tasks = [];
  final textController = TextEditingController();

  @override
  void initState() {
    super.initState();
    fetchTasks();
  }

  Future<void> fetchTasks() async {
    final response = await http.get(
      Uri.parse(
          'https://barra.cos.ufrj.br:443/rest/tarefas?email=eq.${widget.email}'),
      headers: {
        'Authorization': 'Bearer ${widget.token}',
        'Content-Type': 'application/json'
      },
    );

    if (response.statusCode == 200) {
      final data = json.decode(response.body);
      if (data.isNotEmpty) {
        setState(() {
          tasks.clear();
          tasks.addAll(List<Map<String, dynamic>>.from(data[0]['valor']));
        });
      }
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
            content: Text('Erro ao carregar tarefas: ${response.statusCode}')),
      );
    }
  }

  Future<void> addTask(String title) async {
    if (title.trim().isEmpty) return;

    setState(() {
      tasks.insert(0, {
        'titulo': title.trim(),
        'concluida': false,
        'isBeingDeleted': false
      });
    });

    await updateTasksOnServer();
    textController.clear();
  }

  Future<void> updateTasksOnServer() async {
    final response = await http.patch(
      Uri.parse(
          'https://barra.cos.ufrj.br:443/rest/tarefas?email=eq.${widget.email}'),
      headers: {
        'Authorization': 'Bearer ${widget.token}',
        'Content-Type': 'application/json'
      },
      body: json.encode({'email': widget.email, 'valor': tasks}),
    );

    if (response.statusCode != 204) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
            content: Text(
                'Erro ao atualizar tarefas: ${response.statusCode} ${response.body}')),
      );
    } else {
      fetchTasks();
    }
  }

  void _toggleCompletion(int index) {
    setState(() {
      tasks[index]['concluida'] = !tasks[index]['concluida'];
      _sortTasks();
    });
    updateTasksOnServer();
  }

  void _deleteTaskWithUndo(int index) {
    setState(() {
      tasks[index]['isBeingDeleted'] = true;
    });

    Future.delayed(const Duration(seconds: 3), () {
      if (mounted && tasks[index]['isBeingDeleted'] == true) {
        if (index < tasks.length && tasks[index]['isBeingDeleted'] == true) {
          _deleteTask(index);
        }
      }
    });
  }

  void _undoDeleteTask(int index) {
    setState(() {
      tasks[index]['isBeingDeleted'] = false;
    });
    updateTasksOnServer();
  }

  void _sortTasks() {
    tasks.sort((a, b) {
      if (a['concluida'] && !b['concluida']) {
        return 1;
      } else if (!a['concluida'] && b['concluida']) {
        return -1;
      } else {
        return 0;
      }
    });
  }

  void _deleteTask(int index) {
    setState(() {
      tasks.removeAt(index);
    });
    updateTasksOnServer();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Task List'),
        backgroundColor: const Color.fromARGB(255, 128, 0, 0),
      ),
      body: Column(
        children: [
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: TextField(
              controller: textController,
              onSubmitted: (value) {
                addTask(value);
              },
              decoration: const InputDecoration(
                labelText: 'Add Task',
              ),
            ),
          ),
          Expanded(
            child: ListView.builder(
              itemCount: tasks.length,
              itemBuilder: (context, index) {
                final task = tasks[index];
                final isBeingDeleted = task['isBeingDeleted'] == true;
                final isCompleted = task['concluida'] == true;
                final backgroundColor = isBeingDeleted
                    ? Colors.red
                    : (index % 3 == 0
                        ? const Color.fromARGB(255, 99, 12, 0)
                        : index % 3 == 1
                            ? const Color.fromARGB(255, 245, 245, 245)
                            : const Color.fromARGB(255, 0, 63, 5));
                final textColor = backgroundColor ==
                            const Color.fromARGB(255, 0, 63, 5) ||
                        backgroundColor == const Color.fromARGB(255, 99, 12, 0)
                    ? Colors.white
                    : Colors.black;

                return Padding(
                  padding: const EdgeInsets.symmetric(
                      horizontal: 16.0, vertical: 8.0),
                  child: Dismissible(
                    key: Key(task['titulo']),
                    background: Container(
                      color: Colors.green,
                      alignment: Alignment.centerLeft,
                      padding: const EdgeInsets.only(left: 20.0),
                      child: const Icon(Icons.check, color: Colors.white),
                    ),
                    secondaryBackground: Container(
                      color: Colors.red,
                      alignment: Alignment.centerRight,
                      padding: const EdgeInsets.only(right: 20.0),
                      child: const Icon(Icons.delete, color: Colors.white),
                    ),
                    confirmDismiss: (direction) async {
                      if (direction == DismissDirection.endToStart) {
                        _deleteTaskWithUndo(index);
                        return false;
                      } else if (direction == DismissDirection.startToEnd) {
                        _toggleCompletion(index);
                        return false;
                      }
                      return false;
                    },
                    child: Container(
                      decoration: BoxDecoration(
                        color: backgroundColor,
                        borderRadius: BorderRadius.circular(8.0),
                        border: Border.all(
                          color: const Color.fromARGB(255, 0, 42, 116),
                          width: 2.0,
                        ),
                      ),
                      child: ListTile(
                        title: Text(
                          task['titulo'],
                          style: TextStyle(
                            color: textColor,
                            decoration: isCompleted
                                ? TextDecoration.lineThrough
                                : TextDecoration.none,
                          ),
                        ),
                        trailing: Row(
                          mainAxisSize: MainAxisSize.min,
                          children: [
                            Checkbox(
                              value: isCompleted,
                              onChanged: (_) => _toggleCompletion(index),
                            ),
                            isBeingDeleted
                                ? IconButton(
                                    icon: const Icon(Icons.undo),
                                    onPressed: () => _undoDeleteTask(index),
                                  )
                                : IconButton(
                                    icon: const Icon(Icons.delete),
                                    onPressed: () => _deleteTaskWithUndo(index),
                                  ),
                          ],
                        ),
                      ),
                    ),
                  ),
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}