2
respostas

[Sugestão] Resolvendo o problema que a tarefa não aparece na tela inicial após salvar

Para os colegas que estão tendo o problema que depois de salvar a tarefa e retornar a tela inicial, a lista não é atualizada com a nova tarefa, aqui vai a explicação e como resolver: Isso está acontecendo porque há um erro no projeto da aula que permite que o setState() e, consequentemente o findAll(), seja executado antes mesmo de concluir o save/insert no banco. Então quando a lista da tela inicial é recriada, a nova tarefa ainda não está no banco. Para resolver é bem simples: basta fazer com que se aguarde a conclusão do save() antes de retornar a tela inicial com o Navigator.pop(context). Para isso basta tornar assíncrona a função que chama o save() e o Navigator.pop (no caso é o onPressed do ElevatedButton). E depois usar await na chamada de save().

ElevatedButton(
  onPressed: () async {
    if (_formKey.currentState!.validate()) {
      await TaskDao().save(Task(
          nameController.text,
          imageController.text,
          int.parse(difficultyController.text)));
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
          content: Text('Criando uma nova Tarefa'),
        ),
      );
      Navigator.pop(context);
    }
  },
  child: Text('Adicionar!'),
),
2 respostas
 onPressed: () async {
await TaskDao().save(Task(

Olá, Rafael! Muito obrigado por compartilhar essa dica conosco.

Você está absolutamente correto. No Flutter, quando estamos lidando com operações assíncronas, como salvar dados em um banco de dados, precisamos garantir que a operação seja concluída antes de prosseguir. Caso contrário, podemos enfrentar problemas como o que você descreveu, onde a tarefa não aparece na tela inicial porque o setState() e o findAll() foram executados antes de a tarefa ser salva.

Seu código é um ótimo exemplo de como resolver esse problema. Tornando a função onPressed do ElevatedButton assíncrona e usando await na chamada de save(), você garante que a tarefa seja salva antes de voltar para a tela inicial com Navigator.pop(context).

Espero que todos possam se beneficiar dessa dica. Mais uma vez, obrigado por compartilhar sua solução, Rafael!

Bons estudos!