A pergunta "Qual é o melhor gerenciador de estado para Flutter?" costuma gerar debates fervorosos. No cenário atual, deixando de lado opções simples como Provider ou GetX, a batalha pelo nível enterprise se resume a dois gigantes: BLoC (Business Logic Component) e Riverpod.
Se você está a construir uma aplicação que vai sobreviver anos e precisa ser testável e modular, a escolha entre os dois ditará a arquitetura inteira da app.
BLoC: A Máquina de Estados Estrita
O BLoC, criado no Google, força uma separação cirúrgica entre a UI e a regra de negócios. Ele opera transformando Streams de Eventos em Streams de Estados.
// Exemplo de Bloc
class AuthBloc extends Bloc<AuthEvent, AuthState> {
final AuthRepository authRepository;
AuthBloc(this.authRepository) : super(AuthInitial()) {
on<LoginRequested>((event, emit) async {
emit(AuthLoading());
try {
final user = await authRepository.login(event.email, event.password);
emit(AuthAuthenticated(user));
} catch (e) {
emit(AuthError(e.toString()));
}
});
}
}
Quando usar BLoC: Em projetos com times grandes. O boilerplate "forçado" do BLoC garante que um Dev Júnior e um Dev Sênior estruturem as funcionalidades da mesma maneira, tornando o código altamente previsível.
Riverpod: Injeção de Dependência Reativa
O Riverpod (um anagrama de Provider) foi desenhado para resolver todas as limitações do Provider original. Ele atua como gerenciador de estado, sistema de injeção de dependências (DI) e tratador nativo de código assíncrono.
Com o novo Riverpod Generator (anotações), o código tornou-se muito mais enxuto:
@riverpod
class AuthController extends _$AuthController {
@override
FutureOr<User?> build() {
return null; // Estado inicial
}
Future<void> login(String email, String password) async {
state = const AsyncValue.loading();
try {
final user = await ref.read(authRepositoryProvider).login(email, password);
state = AsyncValue.data(user);
} catch (e, st) {
state = AsyncValue.error(e, st);
}
}
}
As Vantagens do Riverpod:
- Os Providers são globais (não dependem do
BuildContextou da árvore de widgets), mas o estado é descartado da memória automaticamente (autoDispose) quando não é mais usado. - Trata Loading e Erro nativamente via
AsyncValue, eliminando a necessidade de criar classes de estado extensas.
O Veredito
O BLoC é excelente para aplicações com lógicas baseadas puramente em eventos sequenciais (Apps bancárias, fluxos de carrinhos complexos). O Riverpod brilha pela sua flexibilidade e integração assíncrona profunda, exigindo menos linhas de código para buscar dados de APIs e sincronizar UI.
O fator determinante deve ser o conhecimento prévio da equipa. Em 2026, ambas as soluções garantem arquiteturas de topo.