Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Como carregar os dados do ListTile no formulario

Eu preciso que quando se clique na tarefa, seja aberto um formulario com os dados. Para isso usei um onTap no ListTile com o seguinte código:

onTap: (){
                                debugPrint('Entrando no form');
                                Navigator.of(context)
                                    .push(
                                  MaterialPageRoute(
                                    builder: (context) => TaskForm(),
                                  ),
                                )
                                    .then(
                                      (value) => setState(() {
                                    TaskDao().findAll();
                                  }),
                                );
                              },

Código do floating button

floatingActionButton: FloatingActionButton(
        onPressed: () {
          Navigator.of(context)
              .push(
                MaterialPageRoute(
                  builder: (context) => TaskForm(),
                ),
              )
              .then(
                (value) => setState(() {
                  TaskDao().findAll();
                }),
              );
        },

Esse é o início do meu TaskForm:

class TaskForm extends StatefulWidget {

  const TaskForm({Key? key}) : super(key: key);

  @override
  State<TaskForm> createState() => _TaskFormState();
}

class _TaskFormState extends State<TaskForm> {

  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _difficultController = TextEditingController();
  final TextEditingController _imageController = TextEditingController();

  final _formKey = GlobalKey<FormState>();
1 resposta
solução!

Oi Celso, tudo bem?

Pelo que entendi, você está com dificuldades em carregar os dados do ListTile no formulário ao clicar em uma tarefa, correto? Vou te ajudar!

No código que você compartilhou, você está passando a classe TaskForm como builder para a navegação no Navigator. Isso significa que sempre que você chamar o Navigator.of(context).push, uma nova instância de TaskForm será criada.

Para carregar os dados do ListTile no formulário, você precisa passar os dados da tarefa selecionada para a instância de TaskForm que está sendo criada. Uma forma de fazer isso é passar os dados como argumentos para a classe TaskForm.

Vou te mostrar um exemplo de como fazer isso:

No código do ListTile, você pode passar os dados da tarefa como argumentos para a classe TaskForm:

onTap: () {
  debugPrint('Entrando no form');
  Navigator.of(context).push(
    MaterialPageRoute(
      builder: (context) => TaskForm(
        task: task, // passando a tarefa selecionada como argumento
      ),
    ),
  ).then((value) {
    setState(() {
      TaskDao().findAll();
    });
  });
},

No código do TaskForm, você precisa receber os argumentos e usá-los para preencher os campos do formulário:

class TaskForm extends StatefulWidget {
  final Task task; // recebendo a tarefa como argumento

  const TaskForm({Key? key, required this.task}) : super(key: key);

  @override
  State<TaskForm> createState() => _TaskFormState();
}

class _TaskFormState extends State<TaskForm> {
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _difficultController = TextEditingController();
  final TextEditingController _imageController = TextEditingController();

  final _formKey = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
    // preenchendo os campos do formulário com os dados da tarefa
    _nameController.text = widget.task.name;
    _difficultController.text = widget.task.difficulty;
    _imageController.text = widget.task.image;
  }

  // restante do código do TaskForm...
}

Dessa forma, ao abrir o formulário, os campos serão preenchidos com os dados da tarefa selecionada.

Espero ter ajudado!

Um abraço.