1
resposta

Comunicação entre widgets.

Olá. Estou no momento na aula 4 ("conversando entre widgets") do curso. Enquanto era explicado sobre a comunicação e envio de dados entre os widgets (no caso, dados do formulário para a tela inicial) me surgiu uma dúvida: será que não daria pra fazer isso usando o setState? O que pensei foi:

  • na classe que define o State da página inicial, armazenaria a lista de containers que apresentaria os dados recebidos do formulário.
  • nesta mesma classe, também definiria uma função que faz o seguinte: adiciona um novo container na lista de containers e, logo após, chama o método setState() para reconstruir a tela.
  • este método seria chamado ao pressionar o botão na página do formulário e após as validações passarem.

O código para as classes da tela inicial e para a tela de formulário seriam mais ou menos os seguintes:

class MyHomePageState extends State<MyHomePage> {
  static List<Widget> containeres = [];
    //Lista de containers que possuem um unico filho: um texto que eh adicionado no formulario

  void add(String nome) {
    containeres.add(Container(child: Text(nome),));
    setState(() {});
  }
    
  @override
    ...
              floatingActionButton: FloatingActionButton.large(child: Icon(Icons.add) ,onPressed: (){
        Navigator.push(context, MaterialPageRoute(builder: (context) => Formulario(this))); //página de formulário recebe referência da página inicial e guarda em uma variável chamada "paginaInicial".
      }
}

Dentro da página de formulário:

                  FloatingActionButton.large(onPressed: () {
                    if (chave.currentState!.validate()) {
                      widget.paginaInicial.add(nome as String);
                      Navigator.pop(context);
                    }
                  }

Dito isso ficam 3 perguntas:

  1. Por que este código não está funcionando? obs.: quando retiro a linha (widget.paginaInicial.add(nome as String);) e deixo apenas a linha de voltar à página inicial (Navigator.pop(context);) ele funciona.
  2. Esse raciocínio faz sentido? Ou por algum motivo essa abordagem não funcionaria?
  3. Caso essa abordagem não funcione, de que forma o uso de context e Inherited solucionaria isso? Ou melhoraria, caso funcione? obs.: agradeço se a resposta vier como uma explicação sobre context, porque realmente ainda não consegui entender o conceito, e de que forma ele se diferencia de state.

Obrigado.

1 resposta

Olá, Eduardo!

Você está no caminho certo ao tentar entender a comunicação entre widgets no Flutter. Sua abordagem de usar o setState para atualizar a lista de containers e reconstruir a tela é válida. No entanto, parece que você está encontrando alguns problemas. Vamos tentar entender cada um deles:

  1. O código não está funcionando provavelmente porque você está tentando acessar o estado de um widget de outro widget. No Flutter, o estado de um widget é privado e não pode ser acessado diretamente de outro widget. Quando você tenta chamar widget.paginaInicial.add(nome as String);, você está tentando modificar o estado de MyHomePage a partir do widget Formulario. Isso não é permitido no Flutter.

  2. Seu raciocínio faz sentido, mas a abordagem que você está tentando usar não é a mais recomendada quando se trata de comunicação entre widgets no Flutter. A ideia de usar o setState para atualizar a lista de containers e reconstruir a tela é correta, mas você deve fazer isso dentro do mesmo widget, não de outro widget.

  3. O uso de context e InheritedWidget pode resolver esse problema permitindo que você compartilhe dados entre widgets. O context é uma referência ao local do widget na árvore de widgets, e o InheritedWidget é uma maneira de propagar informações pela árvore de widgets. Em outras palavras, o InheritedWidget permite que você compartilhe dados entre widgets sem ter que passar explicitamente os dados através do construtor do widget.

A principal diferença entre context e state é que o state é uma informação que pode mudar ao longo do tempo e pode causar uma reconstrução do widget, enquanto o context é uma referência ao local do widget na árvore de widgets e não muda ao longo do tempo.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software