State Management to sposób zarządzania stanem aplikacji (dane, UI state, user input). Flutter ma wiele rozwiązań — Riverpod i Bloc to najpopularniejsze w 2026.
Czym jest State
State to dane które się zmieniają:
- User logged in? (auth state)
- Lista produktów (data state)
- Loading spinner visible? (UI state)
- Form input values (form state)
Bez state management: setState() w każdym widgecie. Chaos przy > 10 ekranach.
Riverpod
Zalety:
- Prosty — mniej boilerplate niż Bloc
- Type-safe — compile-time errors
- Testable — łatwe mockowanie
- Dependency injection built-in
Wady:
- Mniej structured niż Bloc (łatwo zrobić bałagan)
- Młodszy niż Bloc (mniej materiałów)
Kiedy używać: MVP, małe-średnie projekty, gdy chcesz szybkości
Bloc (Business Logic Component)
Zalety:
- Structured — events, states, blocs
- Predictable — każda zmiana przez event
- Testable — łatwe unit testy
- Mature — dużo materiałów i przykładów
Wady:
- Więcej boilerplate (events, states, blocs)
- Stroma krzywa uczenia
- Overkill dla prostych apps
Kiedy używać: Duże projekty, enterprise, gdy potrzebujesz structure
💡 Assadante recommendation
Dla MVP: Riverpod. Szybszy development, mniej kodu, wystarczająco structured. Bloc tylko jeśli masz > 5 devów lub bardzo złożoną logikę.
Riverpod — podstawy
Provider types:
- Provider: Read-only value (config, services)
- StateProvider: Simple state (counter, toggle)
- StateNotifierProvider: Complex state (user, cart)
- FutureProvider: Async data (API calls)
- StreamProvider: Real-time data (Firebase streams)
Przykład użycia:
- Definiujesz provider
- Widget czyta provider przez
ref.watch()
- Widget modyfikuje przez
ref.read().method()
- Provider notyfikuje wszystkie widgety które go słuchają
Bloc — podstawy
Struktura:
- Event: Co się dzieje (LoginButtonPressed)
- State: Stan aplikacji (LoginInitial, LoginLoading, LoginSuccess, LoginError)
- Bloc: Logika — mapuje events na states
Flow:
- UI wysyła event do Bloc
- Bloc przetwarza event (API call, validation)
- Bloc emituje nowy state
- UI reaguje na nowy state (pokazuje loading, error, success)
Inne opcje
Provider (legacy): Poprzednik Riverpod — nie używaj dla nowych projektów
GetX: All-in-one (state, routing, DI) — kontrowersyjny, unikaj
MobX: Reactive programming — dobry, ale mniej popularny
📝 Zadanie
Zaimplementuj prosty counter używając Riverpod. Potem przepisz na Bloc. Porównaj ilość kodu i złożoność. Wybierz co wolisz.