Atividade de Recuperação — Módulos 01 a 06

Esta é a sua atividade de recuperação. Ela é individual e você a fará no laboratório, no tempo da aula. Quero que você comece tranquilo: você não vai construir um aplicativo do zero. Eu já preparei um projeto que abre, compila e roda, com as duas telas montadas e a navegação no lugar. O que está faltando são quatro pequenos trechos de código, e cada um deles corresponde a um conceito que estudamos nos Módulos 01 a 06. Seu trabalho é completar esses quatro trechos, marcados no código com um comentário // TODO. Nada além disso.

Leia esta página inteira antes de digitar a primeira linha. Cada tarefa abaixo mostra o trecho que você precisa completar e explica, em palavras, o que ele deve fazer. O código que aparece está incompleto de propósito: a parte que falta é exatamente o que está sendo avaliado, então é você quem escreve.

Como funciona: trabalho individual, no laboratório. Você pode consultar os materiais dos Módulos 01 a 06 e o resumo de estudo. Abra o projeto, rode para confirmar que tudo sobe, e então complete os quatro // TODO. Ao final, o aplicativo deve cadastrar uma tarefa e mostrá-la na lista.

O aplicativo

O projeto se chama Minhas Tarefas e tem duas telas: uma lista de tarefas e um formulário para cadastrar uma tarefa nova. O botão da lista abre o formulário; ao salvar uma tarefa válida, o aplicativo volta para a lista mostrando a tarefa criada. Toda essa estrutura já está pronta. Você só precisa fazer as quatro peças que faltam funcionarem.

flowchart LR
    A[Tela de Lista] -->|botão Nova| B[Tela de Formulário]
    B -->|salvar válido| A

Tarefa 1 — Rodar o projeto (Módulo 01)

Abra o projeto no VS Code e execute-o antes de qualquer outra coisa. Você deve ver a tela de lista, ainda vazia. Se o aplicativo não subir, resolva isso primeiro: nada do resto pode ser avaliado sem o projeto rodando. Esta tarefa não exige escrever código, apenas confirmar que o seu ambiente está funcionando.

Tarefa 2 — Concluir uma tarefa (Módulo 02)

Cada tarefa na lista tem um botão de concluir, que já está pronto. O que falta é a regra que marca a tarefa como concluída quando esse botão é tocado. No arquivo lib/dados/repositorio_tarefas.dart, o método concluir já encontra a posição da tarefa pelo seu id. Complete-o para substituir aquela tarefa por uma cópia marcada como concluída, usando o método copyWith da entidade, e em seguida avisar a lista com notifyListeners(). Lembre-se de que a tarefa é imutável: você não altera a tarefa existente, você a substitui por uma cópia.

void concluir(String id) {
  final indice = _tarefas.indexWhere((tarefa) => tarefa.id == id);
  if (indice == -1) return;
  // TODO: substituir a tarefa nessa posicao (_tarefas[indice]) por uma
  // copia marcada como concluida, usando copyWith(concluida: true),
  // e depois chamar notifyListeners().
}

Tarefa 3 — Mostrar a tarefa na lista (Módulos 03 e 04)

No arquivo lib/telas/tela_lista.dart, a lista já percorre as tarefas com um ListView.builder, e o botão de concluir já está pronto no método _botaoConcluir. Falta dizer o que cada item mostra. Complete o item para retornar um ListTile que exibe o título da tarefa daquela posição e que usa o botão de concluir já pronto na sua lateral.

itemBuilder: (context, indice) {
  final tarefa = tarefas[indice];
  // TODO: retornar um ListTile cujo title é um Text exibindo o
  // titulo da tarefa e cujo trailing é _botaoConcluir(tarefa).
}

Tarefa 4 — Validar o campo do formulário (Módulo 06)

No arquivo lib/telas/tela_formulario.dart, o campo de texto do título já existe, mas o validator está vazio. Complete-o para que um título vazio seja recusado e para que títulos com menos de três caracteres também sejam recusados, devolvendo uma mensagem de erro nesses casos e null quando o título for válido.

TextFormField(
  controller: _tituloController,
  validator: (valor) {
    // TODO: se valor for nulo ou vazio, retornar uma mensagem de erro.
    // Se tiver menos de 3 caracteres, retornar outra mensagem.
    // Caso contrário, retornar null.
  },
)

Tarefa 5 — Ligar o botão à navegação (Módulo 05)

Ainda em lib/telas/tela_lista.dart, o botão que abre o formulário já está na tela, mas o seu onPressed está vazio. Complete-o para navegar até a rota nomeada do formulário, que já está registrada no go_router com o nome 'formulario'.

FloatingActionButton(
  onPressed: () {
    // TODO: navegar para a rota de nome 'formulario'
    // usando o go_router (context.goNamed).
  },
  child: const Icon(Icons.add),
)

Quanto tempo dedicar a cada parte

Use a divisão abaixo como referência. Se travar em uma tarefa, passe para a próxima e volte depois: é melhor entregar três tarefas funcionando do que ficar preso em uma só.

Tempo Tarefa
0–10 min Rodar o projeto (Tarefa 1)
10–30 min Concluir tarefa (Tarefa 2)
30–50 min Item da lista (Tarefa 3)
50–65 min Validação (Tarefa 4)
65–80 min Navegação (Tarefa 5) e teste final

Como saber que terminou

Ao completar as quatro peças de código, rode o aplicativo e faça o caminho inteiro: na lista, toque no botão de adicionar, preencha um título válido no formulário, salve e veja a tarefa aparecer na lista. Toque no botão de concluir ao lado da tarefa e confirme que ela passa a aparecer como concluída. Teste também um título inválido, deixando o campo vazio, e confirme que a mensagem de erro aparece e o salvamento é bloqueado. Se esse fluxo funciona, sua atividade está completa.

Antes de entregar, confira os quatro pontos que mais custam nota: o método concluir deve substituir a tarefa por uma cópia com copyWith e chamar notifyListeners(); o item da lista precisa mostrar o título de verdade, não um texto fixo; o validator precisa devolver null quando o título é válido; e a navegação deve usar o nome da rota, não um construtor de tela.

Entrega

Ao final do tempo, rode o seguinte na pasta raiz do projeto:

  1. Abra o cmd
  2. Vá até a pasta do projeto
  3. Execute flutter clean
  4. Compacte a pasta para uma rquivo ZIP
  5. Entregue o arquivo zipado na tarefa do Teams.