State management in Flutter has a culture problem. People pick a solution, get good at it, and then defend it like it's a moral position. I've used Bloc, Riverpod, and plain ValueNotifier on different projects and none of them is universally correct.
What the choice actually depends on
Team size and discipline. Bloc's verbosity is a feature when five people are writing the same codebase — the structure is enforced, not assumed. Riverpod is faster for solo work or small teams who know what they're doing. Provider is fine for simple apps that aren't going to grow.
"Use the simplest thing that keeps the code readable six months from now. Not the thing with the best Reddit reputation."
The Bloc pattern is worth understanding regardless
Even if you don't use Bloc in production, the event-state model it enforces is the right way to think about UI state. Events are user intents. States are snapshots of truth. The UI is a pure function of state. Once you internalize that, every other state management solution becomes easier to reason about.
// The event-state model in Bloc
// Events = what the user wants to do
sealed class AuthEvent {}
class LoginRequested extends AuthEvent {
final String email, password;
LoginRequested(this.email, this.password);
}
// States = what the UI should show
sealed class AuthState {}
class AuthIdle extends AuthState {}
class AuthLoading extends AuthState {}
class AuthSuccess extends AuthState { final User user; AuthSuccess(this.user); }
class AuthFailure extends AuthState { final String message; AuthFailure(this.message); }What I reach for now
Bloc for anything with complex async flows or multiple concurrent states. Riverpod with hooks for simpler screens where I want less boilerplate. ValueNotifier + ListenableBuilder for truly local, one-widget state. Mixing them in the same app is fine — the dogma that you must pick one is not.