# BLoC y Cubit: Patrones de Gestión de Estado
**BLoC (Business Logic Component)** es uno de los patrones de gestión de estado más populares y robustos en el ecosistema Flutter. Separa la presentación de la lógica de negocio mediante **Eventos** (entradas) y **Estados** (salidas).
## ¿Por qué BLoC?
- **Separación de responsabilidades:** La UI no sabe de lógica, solo pinta estados y envía eventos.
- **Testabilidad:** Al ser lógica pura Dart (sin dependencias de Flutter), es fácil de testear.
- **Trazabilidad:** Sabes exactamente qué evento causó qué cambio de estado.
## Cubit vs BLoC
La librería `flutter_bloc` ofrece dos herramientas:
### 1. Cubit
Es una versión simplificada de BLoC.
- **Entrada:** Funciones (métodos públicos).
- **Salida:** Estados.
- **Uso:** Casos simples donde no necesitas trazar eventos complejos.
```dart
class CounterCubit extends Cubit {
CounterCubit() : super(0);
void increment() => emit(state + 1);
void decrement() => emit(state - 1);
}
```
### 2. BLoC
La versión completa basada en Streams.
- **Entrada:** Eventos (clases).
- **Salida:** Estados.
- **Uso:** Lógica compleja, transformaciones de eventos (debounce, throttle).
```dart
// Eventos
abstract class CounterEvent {}
class Increment extends CounterEvent {}
// BLoC
class CounterBloc extends Bloc {
CounterBloc() : super(0) {
on((event, emit) {
emit(state + 1);
});
}
}
```
## Implementación Práctica
### Definir Estados
Siempre define una clase base y estados específicos. Usar `Equatable` ayuda a comparar estados para evitar reconstrucciones innecesarias.
```dart
abstract class AuthState extends Equatable {
@override
List