Desvendando o Cubit: Simplificando o Gerenciamento de Estado no Flutter

Raphael Pontes
5 min readMay 3, 2024

--

Desenvolver aplicativos para dispositivos móveis é uma jornada emocionante, o Flutter é um framework criado pelo Google, veio para simplificar essa jornada. Mas há um conceito que pode parecer desafiador para os iniciantes: o gerenciamento de estado. Neste artigo, vamos explorar por que o gerenciamento de estado é crucial e como o Cubit pode facilitar essa tarefa.

O que é o Flutter e o Gerenciamento de Estado:

O Flutter é um framework de código aberto que permite o desenvolvimento de aplicativos móveis nativos para iOS e Android a partir de uma única base de código. Ele utiliza a linguagem Dart e oferece uma abordagem moderna e reativa para criar interfaces de usuário bonitas e fluidas.

O gerenciamento de estado é fundamental em qualquer aplicativo, pois permite controlar e atualizar dinamicamente os dados e a interface do usuário em resposta a eventos e interações do usuário. No contexto do Flutter, onde as interfaces de usuário são altamente dinâmicas, o gerenciamento de estado torna-se ainda mais importante para garantir a consistência do aplicativo.

Benefícios do Gerenciamento de Estado no Flutter e do Cubit:

O uso eficaz do gerenciamento de estado traz diversos benefícios, incluindo:

  1. Organização do Código: Separação clara entre a lógica de negócios e a interface do usuário, facilitando a manutenção e a escalabilidade do código.
  2. Prevenção de Bugs: Redução de bugs relacionados à manipulação incorreta de estados e dados.
  3. Melhoria da Experiência do Usuário: Interfaces do usuário mais dinâmicas, proporcionando uma experiência de usuário mais agradável.

O Cubit, uma biblioteca de gerenciamento de estado para o Flutter, oferece uma abordagem simplificada e eficiente para lidar com o estado da aplicação. Ele facilita a separação das páginas das regras de negócios e fornece um fluxo de dados claro e reativo entre os componentes da aplicação.

Explorando o Cubit:

O Cubit é uma ferramenta poderosa para gerenciamento de estado no Flutter. Vamos analisar mais detalhadamente algumas de suas principais classes e funções:

  • BlocProvider: Esta classe desempenha um papel fundamental no fornecimento do Cubit para a árvore de widgets. Ela é colocada no topo da hierarquia de widgets e permite que qualquer widget descendente tenha acesso ao Cubit. Isso é feito através do método BlocProvider.of<T>(context), onde T é o tipo do Cubit que está sendo acessado. Essa abordagem facilita a injeção de dependência e garante que todos os widgets que precisam acessar o Cubit possam fazê-lo facilmente.
  • Cubit: A classe Cubit é o coração do sistema de gerenciamento de estado. Ela estende a classe Cubit<T>, onde T é o tipo de estado que está sendo gerenciado. O Cubit possui métodos para atualizar o estado e notificar os widgets interessados sobre as mudanças. O método emit(T state) é usado para emitir um novo estado, enquanto os métodos addError e onError são usados para lidar com erros que podem ocorrer durante a execução do aplicativo. O método close() é usado para liberar recursos quando o Cubit não é mais necessário.
  • BlocBuilder: Este widget é uma maneira conveniente de reconstruir os widgets filhos sempre que o estado do Cubit muda. Ele recebe o tipo do Cubit e o tipo de estado como parâmetros genéricos e um construtor de widgets que é chamado sempre que o estado do Cubit muda. Isso garante que a interface do usuário seja atualizada de forma eficiente e responsiva sempre que houver uma alteração no estado.

Instalando o Cubit:

Antes de começarmos a usar o Cubit em nossos projetos Flutter, é necessário instalá-lo em nosso ambiente de desenvolvimento. Felizmente, isso é bastante simples graças ao gerenciador de pacotes Dart, o Pub.

Basta rodar esse comando no seu terminal dentro do projeto Flutter.

flutter pub add flutter_bloc

Ou adicione a dependência ao seu arquivo pubspec.yaml: Abra o arquivo pubspec.yaml do seu projeto Flutter e adicione a seguinte linha sob a seção dependencies:

dependencies:
flutter:
sdk: flutter
flutter_bloc:

Isso informa ao Dart Pub para baixar e instalar a biblioteca Flutter Bloc (que inclui o Cubit) em sua versão mais recente compatível com a versão especificada.

Após salvar o arquivo pubspec.yaml, abra um terminal na raiz do seu projeto Flutter e execute o comando flutter pub get. Isso irá baixar e instalar as dependências adicionadas ao seu projeto.

Com esses passos concluídos, o Cubit está instalado e pronto para ser utilizado em seu projeto Flutter.

Exemplo de Código:

No exemplo de código fornecido, podemos ver todas essas classes e funções em ação. O Cubit é criado e fornecido para a árvore de widgets usando o BlocProvider no arquivo main.dart. Em seguida, na página do contador (CounterPage), o Cubit é acessado usando BlocProvider.of<CounterCubit>(context), e o BlocBuilder é usado para reconstruir o widget sempre que o estado do Cubit muda.

// main.dart
import 'package:cubit_example/counter_cubit.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({Key? key});

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Cubit Example',
theme: ThemeData(primarySwatch: Colors.blue),
home: BlocProvider(
create: (_) => CounterCubit(),
child: const CounterPage(),
),
);
}
}
// counter_cubit.dart
import 'package:flutter_bloc/flutter_bloc.dart';

class CounterCubit extends Cubit<int> {
CounterCubit() : super(0);

void increment() => emit(state + 1);
void decrement() => emit(state - 1);
}
// counter_page.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:cubit_example/counter_cubit.dart';

class CounterPage extends StatelessWidget {
const CounterPage({Key? key});

@override
Widget build(BuildContext context) {
final counterCubit = BlocProvider.of<CounterCubit>(context);

return Scaffold(
appBar: AppBar(
title: const Text('Counter Cubit Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times:'),
const SizedBox(height: 8),
BlocBuilder<CounterCubit, int>(
builder: (_, value) {
return Text(
'$value',
style: const TextStyle(
fontSize: 24,
fontWeight: FontWeight.bold,
),
);
},
),
],
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: counterCubit!.increment,
tooltip: 'Increment',
child: const Icon(Icons.add),
),
const SizedBox(height: 8),
FloatingActionButton(
onPressed: counterCubit.decrement,
tooltip: 'Decrement',
child: const Icon(Icons.remove),
),
],
),
);
}
}

Código fonte: https://github.com/rkpontes/flutter_cubit_example

Para finalizar:

Dominar o Cubit e o gerenciamento de estado no Flutter é essencial para criar aplicativos móveis reativos e eficientes. O Cubit simplifica esse processo, fornecendo uma abordagem clara e reativa para gerenciar o estado da aplicação.

Ao explorar e entender as classes e funções essenciais do Cubit, você estará bem equipado para criar aplicativos Flutter poderosos.

Lembre-se de continuar praticando, explorando a documentação oficial do Flutter e experimentando com diferentes padrões e técnicas de gerenciamento de estado.

Com dedicação e prática, você estará no caminho certo para se tornar um desenvolvedor Flutter confiante e experiente. Então, mãos à obra e continue aprendendo e explorando o maravilhoso mundo do desenvolvimento de aplicativos móveis com Flutter!

Links Importantes:

  1. Documentação Oficial do Flutter
  2. Repositório do Flutter Bloc
  3. Flutter Community: A comunidade Flutter é um ótimo lugar para interagir com outros desenvolvedores Flutter, fazer perguntas, compartilhar experiências e obter suporte.
  4. Flutter Pub: é um repositório de pacotes Flutter, onde você pode encontrar uma grande variedade de pacotes, incluindo o Flutter Bloc.
  5. Flutter Awesome: O Flutter Awesome é uma lista curada de recursos, ferramentas, bibliotecas e exemplos relacionados ao Flutter. Você pode encontrar uma variedade de recursos úteis aqui, incluindo tutoriais, vídeos e bibliotecas populares.
  6. Artigo em inglês

Te ajudei? Buy me a coffee

Follow me in

--

--

Raphael Pontes
Raphael Pontes

Written by Raphael Pontes

Software Engineer - Mobile Developer - Expert Flutter Developer - Follow Me medium/instagram: @raphaelkennedy

No responses yet