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

[Dúvida] Passando valores entre telas

Olha, bom dia.

Seguindo o que foi apresentando no curso, estou tentando criar um app. No momento estou tentando criar uma tela que contara com alguns filtros, e quando selecionado um componente de outra tela atualizara um campo de texto com o valor apresentando, quando executo as chamadas, aparentemente estão corretas, so que o campo que queria atualizar não esta mudando. Alguém poderia me ajudar ? Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

3 respostas

Crie uma função que atualiza o dado usando o método setState no seu widget RepostScreen, passe essa função como parâmetro no construtor da FilterScreen. Feito isso, basta executar essa função antes do Navigator.pop...

Segue um exemplo com um contador que atualiza o estado de um widget Pai em um widget Filho:

class ParentWidget extends StatefulWidget {
  const ParentWidget({Key? key}) : super(key: key);

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

class _ParentWidgetState extends State<ParentWidget> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('Counter: $_counter'),
        ChildWidget(onIncrement: _incrementCounter),
      ],
    );
  }
}

class ChildWidget extends StatelessWidget {
  final VoidCallback onIncrement;

  const ChildWidget({Key? key, required this.onIncrement}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: onIncrement,
      child: const Text('Increment'),
    );
  }
}
solução!

No seu código seria algo nesse sentido:

Para seu widget ReportScreen: crie um método setState para atualizar a tela com o valor do filtro

void _mudarEstado(String filtroEstado) {
    if (filtroEstado != "Selecione") {
      setState(() {
        aEstado = filtroEstado;
      });
    }
  }

E quando navegar para a tela FilterScreen, passe o método como parâmetro para que a tela FilterScreen possa atualizar a tela ReportScreen.

onPressed: () {
                    Navigator.push(
                      context,
                      MaterialPageRoute(
                        builder: (context) {
                          return FilterScreen(
                            onIncrement: _mudarEstado,
                          );
                        },
                      ),
                    );
                  },

Para seu widget FilterScreen:

List<String> Listaestado = ['Selecione', 'estado1', 'estado2', 'estado3'];

class FilterScreen extends StatefulWidget {
  const FilterScreen({super.key, required this.onIncrement});

  final Function onIncrement;

  @override
  State<FilterScreen> createState() => _FilterScreenState();
}

e para navegar para a pagina ReportScreen atualize a tela chamando a função de setState recebida como parâmetro, antes de chamar o Navigator.pop:

OutlinedButton(
                  onPressed: () {
                    widget.onIncrement(dropdownValue);
                    Navigator.pop(context, dropdownValue);
                  },
                  child: const Text('Filtrar'),
                ),

A resposta funcional perfeitamente, muito obrigado!!