Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Nâo estou conseguindo atualizar a página principal do app após criar uma tarefa.

Boa tarde gente! tô precisando de ajuda!

Estou finalizando o App da lista de tarefas, já está 99% concluído, porém quando saio da página FormScreen, criando uma nova tarefa, não está atualizando a página InitialScreen, onde foi que eu errei?

Abaixo segue o link com gif das duas telas e código:

Task_gif

Projeto no GitHub

Esse é o código do InitialScreen:

import 'package:flutter/material.dart';
import 'package:super_task/components/Task.dart';
import 'package:super_task/data/task_dao.dart';
import 'package:super_task/screens/form_screen.dart';

class InitialScreen extends StatefulWidget {
  @override
  State<InitialScreen> createState() => _InitialScreenState();
}

class _InitialScreenState extends State<InitialScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: Container(),
        actions: [
          IconButton(
            onPressed: () {
              setState(() {});
            },
            icon: const Icon(Icons.refresh_outlined),
          ),
        ],
        title: const Text('Tarefas'),
      ),
      body: Padding(
        padding: const EdgeInsets.only(top: 8, bottom: 70),
        child: FutureBuilder<List<Task>>(
          future: TaskDAO().findAll(),
          builder: ((context, snapshot) {
            List<Task>? items = snapshot.data;
            switch (snapshot.connectionState) {
              case ConnectionState.none:
                return Center(
                  child: Column(
                    children: const [
                      CircularProgressIndicator(),
                      SizedBox(height: 10),
                      Text('Carregando...')
                    ],
                  ),
                );

              case ConnectionState.waiting:
                return Center(
                  child: Column(
                    children: const [
                      SizedBox(
                        height: 50,
                        width: 50,
                        child: CircularProgressIndicator(),
                      ),
                      Text('Carregando...')
                    ],
                  ),
                );
              case ConnectionState.active:
                return Center(
                  child: Column(
                    children: const [
                      CircularProgressIndicator(),
                      Text('Carregando...')
                    ],
                  ),
                );
              case ConnectionState.done:
                if (snapshot.hasData && items != null) {
                  if (items.isNotEmpty) {
                    return ListView.builder(
                        itemCount: items.length,
                        itemBuilder: (BuildContext context, int index) {
                          final Task tarefa = items[index];
                          return tarefa;
                        });
                  }
                  return Center(
                    child: Column(
                      mainAxisAlignment: MainAxisAlignment.center,
                      crossAxisAlignment: CrossAxisAlignment.center,
                      children: const [
                        Icon(
                          Icons.error_outline_outlined,
                          size: 128,
                        ),
                        Text(
                          'Não há nenuma tarefa!',
                          style: TextStyle(fontSize: 32),
                        ),
                      ],
                    ),
                  );
                }
                return const Text('Erro ao carregar Taferas!');
            }
            return const Text('Erro desconhecido!');
          }),
        ),
      ),
      bottomNavigationBar: BottomAppBar(
        shape: const CircularNotchedRectangle(),
        child: Container(height: 50.0),
      ),
      floatingActionButton: FloatingActionButton(
        foregroundColor: Colors.amberAccent,
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(
              builder: (newContext) => FormScreen(taskContext: context),
            ),
          ).then((context) => setState(() {
                debugPrint('Recarregando a tela inicial');
              }));
        },
        tooltip: 'Nova tarefa',
        child: Icon(Icons.add),
        backgroundColor: Colors.black,
        splashColor: Colors.blue,
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
    );
  }
}
4 respostas

O problema deve ser o seu ElevatedButton do formulário, ele não está async, o TaskDao().save antes de tudo e ele tem que ter o await, pode deixar assim:


ElevatedButton(
                        onPressed: () async {
                          if (_formKey.currentState!.validate()) {
                            await TaskDao().save(Task(
                                nameController.text,
                                imagemController.text,
                                int.parse(prioridadeController.text)));

                            ScaffoldMessenger.of(context).showSnackBar(
                              const SnackBar(
                                content: Text('Coloque aqui seu texto'),
                              ),
                            );
                            Navigator.pop(context);
                          }
                        },
                        child: const Text('Adicionar')),

Espero que dê certo! Abraço

Obrigado Paulo Luiz pela ajuda, mas infelizmente não funcionou!

ElevatedButton(
                  onPressed: () async {
                    if (_formKey.currentState!.validate())
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(
                          backgroundColor: Colors.green,
                          elevation: 0.5,
                          duration: Duration(seconds: 4),
                          content:
                              Text('Criando tarefa ${nameController.text}'),
                        ),
                      );
                      Navigator.pop(context);
                      await TaskDAO().save(Task(
                        name: nameController.text,
                        pathImage: pathImageController.text,
                        difficulty: int.parse(difficultyController.text),
                      ));
                    }
                  },
                  child: const Text('Adicionar'),
                )
solução!

Boa tarde, provavelmente não funcionou pois precisa salvar e depois fazer a navegação pra tela principal, sendo assim basta trocar o Navigator.pop pra depois do await TaskDAO().

ElevatedButton(
                  onPressed: () async {
                    if (_formKey.currentState!.validate())
                      ScaffoldMessenger.of(context).showSnackBar(
                        SnackBar(
                          backgroundColor: Colors.green,
                          elevation: 0.5,
                          duration: Duration(seconds: 4),
                          content:
                              Text('Criando tarefa ${nameController.text}'),
                        ),
                      );                 
                      await TaskDAO().save(Task(
                        name: nameController.text,
                        pathImage: pathImageController.text,
                        difficulty: int.parse(difficultyController.text),
                      ));
                    }
                    Navigator.pop(context);
                  },
                  child: const Text('Adicionar'),
                )

Perfeito Rodolfo César Felis! era exatamente isso que você mencionou, algo simples, mas que eu não havia me atentado, obrigado!