[Flutter] FutureBuilder do Jeito Certo
Como utilizar o FutureBuilder no Flutter?
Bastante gente tem feito essa pergunta, então resolvi criar esse post.
Como esse cara funciona?
O FutureBuilder executa a função informada em sua propriedade future.
Até aqui tudo certo, mas temos um problema quando envolve o setState: A função é carregada novamente.
Por quê esse problema acontece?
O Flutter trabalha com duas árvores:
- Árvore de Widgets
A Árvore de Widgets é o código que escrevemos para montar o layout. - Árvore de Elementos
A Árvore de Elementos é um "esqueleto" da UI, uma das sacadas para o Flutter ser tão rápido em desenhar na tela e atualizar seus desenhos nas animações. - Árvore de Renderização
A Árvore de Renderização é a UI em si, a parte visual que o usuário consegue ver.
O setState executa novamente o método build. A estrutura de Widgets se vira muito bem com isso e não reconstrói toda a UI, mas métodos de dentro do build são executados novamente.
Essa é a causa do problema, pois o pessoal costuma colocar a função diretamente na propriedade future do FutureBuilder.
Como resolver esse problema?
Essa pergunta é fácil de responder, basta criar uma variável do tipo Future<Tipo>
e iniciá-la no InitState de seu widget. Dessa forma, podemos utilizar essa variável na propriedade future do FutureBuilder, impedindo que a função seja executada novamente.
Resumão
Sempre que quiser trabalhar com FutureBuilder, não coloque a função diretamente na propriedade future, pois o setState sempre executa o método build, iniciando novamente sua função.
Crie uma variável do tipo Future<Tipo>
e inicie a função no InitState de seu widget;
Utilize essa variável na propriedade future, dessa forma não iniciará novamente a função com um setState;
Exemplo
- Quando os segundos da hora atual forem par, será apresentado um quadrado verde;
- Quando os segundos da hora atual forem ímpar, será apresentado um quadrado vermelho;
- O número capturado, e os setStates serão printados no DEBUG CONSOLE;
- O código está comentado para facilitar o entendimento;
Valeu pessoal, até a próxima!