O que é gerenciamento de estados no Flutter e principais ferramentas

O que é gerenciamento de estados no Flutter e principais ferramentas
Jhoisnáyra Vitória Rodrigues de Almeida
Jhoisnáyra Vitória Rodrigues de Almeida

Compartilhe

Introdução

Se você é dev Flutter já pode ter se deparado com algum momento em que sua aplicação precisava atualizar um dado na tela para o usuário, não é mesmo?

Isso é frequente quando estamos utilizando um aplicativo que tenha, por exemplo, um carrinho de compras que é atualizado sempre que adicionamos ou retiramos algo dele, como no gif abaixo:

Imagem que mostra um aplicativo de delivery com uma lista horizontal de produtos e, na parte inferior da tela, um carrinho que mostra a quantidade de produtos pegos, o botão “ver carrinho” e o valor total da compra.

Existe um jeito mais simples de lidar com essas mudanças!

Neste artigo, vamos entender melhor o conceito de gerenciamento de estados no Flutter, conhecer algumas das principais bibliotecas e descobrir qual sua relevância para o mercado de trabalho atualmente.

Imersão dev Back-end: mergulhe em programação hoje, com a Alura e o Google Gemini. Domine o desenvolvimento back-end e crie o seu primeiro projeto com Node.js na prática. O evento é 100% gratuito e com certificado de participação. O período de inscrição vai de 18 de novembro de 2024 a 22 de novembro de 2024. Inscreva-se já!

O que é gerenciamento de estados

Para entender o que é gerenciamento de estados, é importante entendermos primeiro o que é um estado.

Um estado, em Flutter, é uma informação ou valor que pode sofrer alterações ao decorrer de uma aplicação, seja quando apertamos um botão, digitamos um texto, etc. Resumindo, esses estados são úteis pois a partir deles podemos saber o que mudou no aplicativo e o que precisa então ser reconstruído para o usuário!

E, à medida que a seu projeto vai crescendo, pode surgir a necessidade de compartilhar estados entre as telas do aplicativo e propagar alterações, visto que algumas informações são importantes para mais de uma tela e precisam ser gerenciadas e atualizadas. Na própria documentação do Flutter, vemos um exemplo em que um aplicativo compartilha em duas telas (MyCatalog e MyCart) o estado de CART:

GIF colorido. Um aplicativo de compras sendo representado no lado esquerdo, passando por uma tela de login, uma de compras e por fim um carrinho com as compras realizadas. Ao lado direito, uma árvore dos Widgets representados pela aplicação, simulando a interação deles durante um gerenciamento de estados.

Fonte da imagem: Documentação da Flutter

Ou seja, o estado CART se refere aos itens do carrinho; esse valor vai sendo alterado à medida em que adicionamos mais itens. Esse estado CART é utilizado em duas telas: MyCatalog e MyCart. Na primeira tela, MyCatalog, os itens são adicionados; na segunda tela, MyCart, precisamos do valor de CART para sabermos quais itens foram adicionados anteriormente.

Assim, é perceptível que mudanças ocorrem o tempo todo em um app, então precisamos saber controlá-las de forma eficiente para que o código do aplicativo rode sem erros. No exemplo, para que as telas fossem redesenhadas e atualizadas com as mudanças de estado (em específico, de CART) que ocorreram, foi necessário usar algum tipo de gerenciamento de estado.

Usando uma linguagem menos técnica, o gerenciamento de estados verifica o que mudou na sua aplicação e reconstrói a tela para o usuário.

Falando de forma mais técnica, o gerenciamento de estado ou state management é a transformação do estado atual da interface (tela) da sua aplicação baseado em determinada informação; é o gerenciamento de estado que faz o trabalho de notificar ao Flutter quando ele deve redesenhar a tela, de modo performático e eficaz.

Além da sua função principal (verificar mudanças e reconstruir a tela), o gerenciamento de estados também traz diversas vantagens que justificam o seu uso:

  • Padronização do projeto com uma melhor estrutura de código;
  • Código mais legível e simples de entender;
  • Possibilidade de manutenção de código;
  • Melhor performance da aplicação.

Legal! Agora que entendemos o que é o gerenciamento de estados e para que ele serve, que tal conhecermos as ferramentas usadas para aplicá-lo no Flutter?

Veremos cinco ferramentas: uma nativa do Flutter e quatro bibliotecas.

SetState - A ferramenta nativa do Flutter

A forma mais simples de gerenciar o estado de uma aplicação é utilizando o SetState, que faz parte da classe StatefulWidget e é uma função que pode ser chamada para notificar o Flutter que algo mudou e que ele deve redesenhar a tela.

Se precisar relembrar a diferença entre Stateful e Stateless Widget em Flutter, recomendo a leitura do artigo Qual é a diferença entre stateless e stateful widget?.

No GIF abaixo, você pode ver um exemplo de um contador, que é um projeto padrão de Flutter ao criar um projeto novo, e nele podemos observar como o SetState funciona. Ao apertar o botão (FloatingActionButton), a função SetState é chamada e todo o conteúdo da tela (_MyHomePageState) é atualizado, incrementando o valor da contagem na tela.

GIF colorido. Aplicação mobile de um contador, na parte superior uma barra azul com um título “Flutter Demo Home Page” em letras brancas. No corpo do aplicativo, um fundo em cor branca e centralizado uma frase “you have to pushed the button this many times” e abaixo um valor sendo incrementado à medida que um botão, azul, redondo e com um símbolo de “+” é pressionado.

Então, quer dizer que gerenciamento de estados em Flutter se resume a usar o SetState?

Na verdade, não, e isso acontece porque o SetState funciona bem para coisas mais simples, como o contador acima, mas não é a melhor opção para aplicações complexas, podendo levar à duplicação de código e à degradação de desempenho.

Para aplicações mais robustas, usamos bibliotecas de gerenciamento de estados! Vamos conhecer quatro delas?

4 Bibliotecas populares do mercado para gerenciamento de estados

No mercado, existem diversas bibliotecas que podem ser usadas para gerenciar estados no Flutter, inclusive, na documentação você pode conferir a lista completa de bibliotecas.

Neste artigo, selecionamos as quatro mais populares para discutirmos sobre elas, descobrir o que são e conhecer algumas das suas características principais. São elas: BLoC, MobX, GetX e Provider.

1) BLoC

BLoC (Business Logic Component, componente de lógica de negócio) é um padrão de arquitetura de software usado para gerenciamento de estados que permite separar a lógica de negócios (regras e processos da aplicação) da interface do usuário (parte com a qual os usuários interagem). O uso de BLoC permite uma boa divisão de responsabilidades e interesses, tornando também o código mais legível, escalável, estável e possibilitando maior controle sobre os estados da aplicação.

Ainda dentro de BLoC, temos o Cubit - que é uma variação do BLoC, sendo possível escolher entre um ou outro para utilização. A principal diferença entre ambos é que Cubit não possui controle sobre o tipo de evento que vai disparar mudanças nos estados da aplicação.

Se quiser saber mais, confira a documentação do padrão BLoC em Flutter.

2) MobX

MobX é uma biblioteca utilizada para gerenciar estados de modo simples e reativo. Ela tem três conceitos importantes:

  1. observables (observáveis): são variáveis/objetos que são "observadas". O MobX acompanha essas mudanças e avisa o Flutter caso aconteça alguma alteração em seu estado;
  2. actions (ações): são as funções que alteram o valor de um observável;
  3. reactions (reações): ocorrem quando o valor dos observáveis mudam, alterando informações na interface da aplicação.

Em resumo, o MobX utiliza o padrão de projeto Observer para gerenciamento dos estados, ou seja, um dado é observado e o MobX reage e atualiza partes da interface do usuário de acordo com mudanças desse dado.

Se quiser saber mais, confira a documentação do pacote MobX em Flutter.

3) GetX

GetX é uma biblioteca de gerenciamento de estados em Flutter reconhecida pelo seu bom desempenho, produtividade, organização e, além disso, por precisar de menos código e evitar reconstruções desnecessárias.

Ela possui três pilares:

  1. Gerenciamento de estados: gerenciamento de estados reativo;
  2. Gerenciamento de rotas: além da navegação entre telas, cria Widgets como Snackbar, Dialogs, entre outros;
  3. Gerenciamento de dependências: solução simples mas poderosa para gerenciamento de dependências utilizando controladores.

Em resumo, GetX permite a propagação de informação dentro da aplicação, atualizando o estado por onde a informação é passada, sendo uma solução rápida, simples e escalável para o gerenciamento de estados.

Se quiser saber mais, confira a documentação do pacote GetX em Flutter.

4) Provider

Provider é uma biblioteca bem utilizada para gerenciamento de estados, mas sua ideia na verdade é propagar informação para toda aplicação de maneira mais simples. É uma biblioteca recomendada pela Google, conhecida por ser simples e eficiente, sendo também recomendada para ser utilizada em conjunto com outras bibliotecas desta lista (como MobX).

Aqui na Alura já temos alguns conteúdos sobre Provider! Se quiser dar uma olhada, recomendo a leitura do artigo Como gerenciar estados com Flutter Provider e o curso Flutter: gerenciamento de estados com Provider.

Se quiser saber mais, confira a documentação do pacote Provider em Flutter.

E quer mais um motivo para estudar gerenciamento de estados e conhecer alguma dessas bibliotecas? Vamos ver algumas vagas de dev Flutter!

Gerenciamento de estado e mercado de trabalho

Para que você se anime mais ainda em estudar essas tecnologias de gerenciamento de estados, fiz uma pesquisa sobre as atuais vagas para pessoas desenvolvedoras Flutter, observando nas especificações das vagas quais bibliotecas eram ditas como requisitos ou diferenciais!

Até a data de publicação deste artigo, foram 30 vagas analisadas nos sites LinkedIn, Indeed, Geekhunter e Github, os níveis variaram entre júnior, pleno, sênior e alguns não especificados, e o tipo de vaga varia entre home office, presencial ou híbrido.

A partir dessas vagas analisadas, podemos ver um gráfico abaixo com as bibliotecas citadas:

Imagem colorida. Gráfico sobre as vagas para desenvolvedor Flutter que citam gerenciamento de estados como requisitos. No eixo horizontal, as bibliotecas “BLoC”, “MobX”, “GetX”, “Provider” e “Cubit”. No eixo vertical, a quantidade de citações. O gráfico apresenta as seguintes informações: a quantidade de vagas citando “BLoC” foram 20, “MobX” foram 18, “GetX” foram 16, “Provider” foram 5 e, finalmente, “Cubit” foram 4.

Analisando de forma diferente os dados que conseguimos, podemos ver que a biblioteca BLoC é a mais citada, sendo requerida em 67% das vagas, seguida de MobX, que apareceu em 60% das vagas, GetX que apareceu em 53%, Provider em 17% e Cubit em 13%.

Conclusão

Neste artigo, aprendemos o que é gerenciamento de estados no Flutter e a função SetState, conhecemos algumas das principais bibliotecas de gerenciamento de estados e também vimos a relevância dessas bibliotecas no mercado de trabalho atual.

Parabéns por ter concluído a leitura, espero que tenha gostado! E se quiser aprender mais sobre Flutter, recomendo as nossas formações: Formação Flutter e Formação Flutter e Firebase.

Bons estudos!

Jhoisnáyra Vitória Rodrigues de Almeida
Jhoisnáyra Vitória Rodrigues de Almeida

Scuba Team Mobile (com foco em Flutter). Estudante de Ciência da Computação na UFPI, pesquisadora da área de Internet das Coisas e formada em Eletrônica pelo IFPI.

Veja outros artigos sobre Mobile