BloC ou Cubit no Flutter: qual escolher?
Se você estuda ou trabalha com Flutter, talvez saiba: qualquer aplicativo precisa de alguma biblioteca de gerenciamento de estados, pois as funcionalidades padrões do Flutter não são suficientes para resolver todas as nossas necessidades.
Existem várias ferramentas que gerenciam estados no Flutter, mas hoje vamos falar de duas grandes bibliotecas no mercado: O BloC e o Cubit.
Neste artigo, você vai descobrir as características, semelhanças, diferenças e qual ferramenta é a mais adequada ao seu projeto.
Vamos lá?
O que é Cubit no Flutter?
O Cubit é um pacote de gerenciamento de estados, que mais recentemente, se fundiu com o pacote BloC.
Portanto, quando você procurar pela biblioteca de Cubit, vai apenas encontrar a de BloC.
Como falei antes, Cubit é uma biblioteca de gerenciamento de estados; serve principalmente para fazer atualizações visuais na tela do dispositivo quando alguma coisa/valor for alterada.
E como isso é feito? O Cubit possui um código que fica “escutando” se algum valor foi alterado no aplicativo.
Esse princípio (de escutar por alguma coisa, realizar uma lógica e atualizar a tela do dispositivo) é o que move praticamente qualquer ferramenta de gerenciamento de estados.
A diferença costuma ser na implementação, controle e situação em que é melhor utilizar uma delas.
Cubit se encontra na parte mais simples no espectro de implementação, sendo uma das bibliotecas mais simples de lidar com estados dentro do Flutter.
Mas vamos entender um pouco melhor as suas vantagens. “Bora”?
Quais são as vantagens do Cubit?
Podemos destacar dois pontos principais:
- Aprendizagem relativamente mais simples;
- Foco na praticidade e eficiência.
Aprendizagem relativamente mais amigável
O Cubit é mais simples de aprender e usar pelos seguintes pontos:
- Curva de aprendizagem mais suave: O Cubit é relativamente mais simples de aprender e aplicar em um projeto. Precisa de muito menos familiaridade com conceitos complexos de gerenciamento de estado e padrões de design;
- Implementação mais clara: Para quem está começando no Flutter, o código escrito com Cubit é bem mais fácil de ler e escrever por conta de uma sintaxe mais direta e concisa;
- Menos Boilerpllate: Ou seja, o Cubit precisa de menos conjuntos de instruções para lidar com estados, dispensando repetição de código.
Foco na praticidade e eficiência
A facilidade e aprendizagem do Cubit deve-se a sua praticidade e eficiência:
- Ideal para casos simples: O Cubit se encaixa perfeitamente para gerenciar estados em projetos com uma regra de negócios mais direta e com interface de usuário com pouca interatividade (ou menos reatividade);
- Desenvolvimento acelerado: A simplicidade do Cubit acelera várias etapas de trabalho: a prototipagem, a validação de ideias e a construção de MVPs;
- Menos fragmentação: A estrutura mais compacta do Cubit pode levar um código menos fragmentado e mais fácil de manter, especialmente para projetos menores;
- Capacidade de escalar: O Cubit é simples, mas não simplório. Versátil, você pode adaptá-lo a projetos de tamanho moderado, que necessitam de certo grau de escalabilidade (a menos que a lógica de negócios seja realmente complexa).
Quais são as desvantagens do Cubit?
Nenhuma tecnologia é absoluta (ou seja, tem pontos fortes e fracos)! Vamos ver as desvantagens do Cubit.
Limitações para casos complexos
Os poderes do Cubit têm limites:
- Falta de modularidade: O Cubit não oferece o mesmo nível de modularidade do BloC, dificultando a reutilização de uma lógica de negócios complexa em diferentes partes da aplicação;
- Tratamento de eventos assíncronos: O Cubit apresenta menos recursos para lidar com eventos assíncronos, como requisições para APIs. Logo, você pode precisar de soluções alternativas ou bibliotecas adicionais;
- Gerenciamento de erros: O Cubit não dispõe de mecanismos robustos para tratar erros e exceções. Então, o cuidado extra é bom para assegurar a segurança da aplicação.
Simplicidade excessiva
Cresceu o projeto? Aí temos alguns pontos fracos do Cubit:
- Falta de flexibilidade: A flexibilidade não é tão elástica. O Cubit vira uma pedra no caminho dos projetos com sofisticadas regras de negócio ou alto grau de controle sobre o fluxo de dados;
- Menos reutilizável: A concisão é uma faca de dois gumes: simplifica por um lado, e, por outro, dificulta que você produza componentes reutilizáveis. Consequentemente, você talvez precise duplicar código em projetos maiores. Esse ponto pode ser conflitante com uma das vantagens, mas aqui o ponto chave é projetos maiores.
O que é BloC no Flutter?
O BloC também é uma biblioteca de gerenciamento de estados, mas ele tem um diferencial na maneira como é implementado.
O BloC utiliza o padrão chamado Business Logic Component, ou "componente de lógica de negócios".
Esse padrão se baseia em uma arquitetura de software que separa responsabilidades dentro do código em camadas, onde a lógica de negócios fica em uma camada dedicada e distinta da interface de usuário.
No BloC, a comunicação entre a interface do usuário e a lógica de negócios é realizada por meio de uma camada de eventos.
Os widgets da interface disparam eventos para as classes BloC que, por sua vez, emite novos estados em resposta a esses eventos.
Essa abordagem reativa atualiza a interface do usuário automaticamente sempre que o estado muda.
Vamos pegar um exemplo prático. Considere um aplicativo de delivery como o iFood: ao adicionar um combo de lanche no carrinho, clicando em um botão, o aplicativo (com ajuda do BloC) dispara eventos: atualizar a tela com o carrinho com o lanche, calcular o valor total do pedido e, enfim, atualizar o estado do aplicativo.
Como funciona o BloC no Flutter
O BloC funciona com quatro componentes que você precisa implementar em seu projeto:
- Eventos: Representam as ações do usuário ou outras entradas que acionam alterações no estado;
- Estados: Representam os dados atuais da aplicação e são imutáveis;
- BloCs: Classes responsáveis por processar eventos e emitir novos estados;
- BlocBuilder e BlocListener: Widgets que observam o estado do BloC e atualizam a interface de usuário de acordo.
Agora que entendemos esses pontos, vamos conhecer as vantagens e desvantagens do BloC.
Quais são as vantagens do BloC?
O BloC, resumindo, possui três vantagens principais:
- Código organizado com um arquitetura robusta e modular;
- Possui ferramentas para testar e garantir qualidade;
- Escalabilidade do projeto em longo prazo.
Arquitetura robusta e modular
Um código organizado é uma necessidade em qualquer aplicação. Onde a bagunça reina, há erros e retrabalho, ou seja, dores de cabeça. O BloC traz:
- Separação de responsabilidades: O BloC separa responsabilidades entre a interface do usuário, a lógica de negócios e o gerenciamento de estado, deixando um código mais organizado, testável e fácil de manter;
- Reuso de código: A estrutura modular do BloC facilita a criação de componentes reutilizáveis e independentes, reduzindo a duplicação de código. Por exemplo, reutilizar classes de eventos para outros componentes;
- Gerenciamento de complexidade: O BloC é ideal para lidar com lógicas de negócios complexas, encadeamento de eventos, tratamento de erros assíncronos e debouncing (limitar requisições por milissegundos) de requisições - e outras funcionalidades avançadas.
Fluxo de dados unidirecional e previsível
A organização trazida pelo BloC vem da maneira em que o fluxo de dados navega em uma aplicação.
Pense que esse fluxo vai de um ponto A a um ponto B, sempre em frente e sem nunca voltar para trás:
- Previsibilidade do estado: O BloC segue um fluxo unidirecional de dados, onde os eventos fluem dos widgets para o BloC, funções processam esses eventos e geram novos estados, e esses estados são então propagados de volta para os widgets. Essa arquitetura garante que o estado da aplicação seja previsível e consistente, facilitando o raciocínio e o debug do código;
- Testabilidade: A separação clara entre eventos, estados e transformações facilita a escrita de testes unitários e de integração, o que contribui para o seu código ficar mais robusto e confiável.
Escalabilidade de projetos
As vantagens anteriores ajudam em outra: a escalabilidade. Em poucas palavras, escalabilidade é a capacidade de uma aplicação crescer de forma saudável e sustentável. Veja os pontos a seguir:
- Aplicações complexas: O BloC foi projetado para lidar com aplicações complexas com alto grau de interação do usuário e regra de negócios, assegurando a escalabilidade do gerenciamento de estado à medida em que o projeto cresce;
- Desempenho eficiente: mesmo aplicações com grande volume de dados e interações frequentes rodam com bom desempenho graças ao BloC;
- Manutenabilidade em longo prazo: O código modular e bem organizado do BloC facilita a manutenção e o aprimoramento da aplicação a longo prazo, reduzindo o tempo e o esforço necessários para futuras modificações.
O BloC é realmente um bloco sólido onde você pode construir uma aplicação duradoura e robusta, repleta de funcionalidades.
Quais são as desvantagens do BloC no Flutter?
As principais desvantagens são duas:
- Curva de aprendizagem mais acentuada;
- Verbosidade do código.
Curva de aprendizagem mais acentuada
Ideal para aplicações complexas, o BloC pode parecer desafiador de início (e seu uso depende de conhecimentos prévios específicos):
- Conceitos complexos: O BloC requer familiaridade com conceitos intermediários e avançados como streams, transformações de eventos, padrões de design como MVVM e programação reativa. Logo, pessoas iniciantes ou menos experientes podem sentir-se desafiadas no início dos estudos;
- Maior tempo de aprendizagem: Dominar o BloC pode levar mais tempo se comparado a outras ferramentas.
Verbosidade do Código
A verbosidade, ou seja, excesso de “palavras”, é um risco possível do BloC:
- Sintaxe detalhada: o BloC tende a gerar um código mais verboso em eventos e transformações complexas. Um risco possível é o aumento da dificuldade na compreensão do código;
- Maior quantidade de código: Um código, a princípio simples, pode ocupar mais linhas com o BloC. Mais código pode aumentar o tempo de desenvolvimento e a complexidade da manutenção;
- Menos legibilidade: O código verboso do BloC pode dificultar a compreensão do fluxo de dados e da lógica de negócios da aplicação, especialmente para pessoas desenvolvedoras pouco habituadas com a ferramenta;
- Complicação desnecessária: Em projetos mais simples, ou seja, com uma lógica de negócio direta e uma interface de usuário com pouca interatividade, o BloC pode complicar o código mais que o necessário.
Cubit ou BloC: qual utilizar no Flutter?
Falamos de todas as diferenças, vantagens e desvantagens de cada uma dessas ferramentas, mas existe um detalhe crucial.
No começo deste artigo, você aprendeu que as duas bibliotecas estão dentro do mesmo pacote. Isso quer dizer que nós temos acesso aos dois pacotes ao mesmo tempo!
Logo, você não é obrigado a trabalhar com apenas uma das ferramentas. Inclusive, a própria documentação recomenda começar com o Cubit e, se a solução não for mais suficiente, você pode incrementar com o BloC.
Por exemplo: Vamos começar o desenvolvimento de uma ideia de um aplicativo de notas (sim, mais um app de notas!).
No começo, o aplicativo não tem muitas features, mas tem um grande diferencial que foi o incentivo para você desenvolvê-lo. Então, você começa pelas partes básicas, utilizando apenas o Cubit.
Aos poucos, a aplicação vai crescendo e ganhando novas features e aí você vê que apenas com Cubit não rola mais desenvolver. Em vez de migrar para outra ferramenta, basta adicionar o BloC!
Neste exemplo, o Cubit fica com a tarefa principal de apenas atualizar os dados, mas a lógica fica responsável pelo BloC.
Quando usar BloC e Cubit?
A decisão entre BloC e Cubit depende dos requisitos específicos do seu projeto, da preferência e da experiência da equipe de desenvolvimento. Em uma palavra, é como uma pessoa sênior diz: "depende".
Para melhor embasar sua decisão, vamos ver alguns casos gerais que servem de orientação.
Quando usar o Cubit no Flutter?
Você pode preferir o Cubit em três situações:
- Projetos simples e médios que priorizam simplicidade, legibilidade e facilidade de implementação;
- Desenvolvedores iniciantes em gerenciamento de estado no Flutter que se beneficiam da simplicidade e curva de aprendizagem mais amigável;
- Casos de uso que não exigem o controle granular do fluxo de eventos e estados proporcionado pelo BloC.
Quando usar o BloC no Flutter?
Veja três casos interessantes em que BloC é uma boa escolha:
- Aplicações complexas com lógica de negócios intrincada e necessidade de controle preciso sobre o fluxo de eventos e estados;
- Projetos que exigem funcionalidades avançadas, como debouncing, throttling e tratamento de erros complexos;
- Equipe experiente com o padrão Flux e familiarizada com os conceitos do BloC.
Como usar o BloC e Cubit?
Acesse a página oficial do BloC e siga os comandos para instalá-lo em seu projeto Flutter.
Cursos de BloC e Cubit
Se você é uma pessoa mais experiente (ou está em um nível intermediário), pode estudar BloC e Cubit na Alura:
Caso você seja iniciante, continue persistindo! Recomendamos que se dedique em aprender bem os fundamentos do Flutter.
Consulte o tech.guide de Flutter para ver as habilidades pedidas pelo mercado e montar seu plano de estudos.
Conclusão
Neste artigo, vimos duas ferramentas excelentes para o gerenciamento de estado no Flutter (e que precisam fazer parte da sua “caixa de ferramentas de dev Flutter”).
O BloC é um conjunto de blocos sólidos que fortalece aplicações complexas, de larga escala, nas mãos de devs experientes.
Já o Cubit é mais flexível e amigável para que pessoas iniciantes construam projetos de pequena e média escala.