Provider növləri və Notifier-lər
Riverpod 3 sənədi provider-ləri iki oxa görə düzür: state dəyişdirilə bilirmi və dəyər sinxron, future, yoxsa stream-dir.
Sadəcə dəyər hesablayan (read-only) provider-lər: Provider, FutureProvider, StreamProvider.
State-i dəyişdirmək üçün metodları olan notifier-lər: NotifierProvider, AsyncNotifierProvider, StreamNotifierProvider.
Seçim qaydası sadədir: UI state-i dəyişdirən metod çağırırsa notifier lazımdır; sadəcə oxuyursa, Provider/FutureProvider kifayətdir.
| Dəyərin növü | Yalnız oxunur | Dəyişdirilir (notifier) |
|---|---|---|
| Sinxron | `Provider` | `NotifierProvider` (`Notifier<T>`) |
| `Future` | `FutureProvider` | `AsyncNotifierProvider` (`AsyncNotifier<T>`) |
| `Stream` | `StreamProvider` | `StreamNotifierProvider` (`StreamNotifier<T>`) |
// 1) Dəyişməyən obyekt: Provider.
final apiClientProvider = Provider<ApiClient>((ref) {
final client = ApiClient();
ref.onDispose(client.close); // təmizləmə nöqtəsi
return client;
});
// 2) Kompozisiya: ProxyProvider yerinə sadəcə ref.watch.
final todoRepositoryProvider = Provider<TodoRepository>((ref) {
return TodoRepository(ref.watch(apiClientProvider));
});
// 3) Async siyahı + dəyişdirmə metodları: AsyncNotifier.
final todosProvider =
AsyncNotifierProvider<TodosNotifier, List<Todo>>(TodosNotifier.new);
class TodosNotifier extends AsyncNotifier<List<Todo>> {
@override
Future<List<Todo>> build() async {
// build-in qaytardığı future AsyncValue-ya çevrilir:
// loading → data, xəta olarsa → error.
return ref.watch(todoRepositoryProvider).fetchAll();
}
Future<void> add(String title) async {
final repo = ref.read(todoRepositoryProvider);
// Optimistik yenilənmə: UI dərhal yeni siyahını görür.
state = AsyncData([...?state.value, Todo(title: title)]);
try {
await repo.create(title);
} catch (error, stackTrace) {
state = AsyncError(error, stackTrace);
return;
}
ref.invalidateSelf(); // serverdən təsdiqlənmiş vəziyyəti yenidən yükləyir
}
}Eyni feature-in üç səviyyəsi: service → repository → notifier.
Riverpod 3-də köhnə API-lar. StateProvider, StateNotifierProvider və ChangeNotifierProvider istifadəni azaltmaq üçün ayrı import-a — package:riverpod/legacy.dart-a köçürülüb. Onlar işləməyə davam edir (geriyə uyğunluq üçün), lakin yeni kodda Notifier/AsyncNotifier istifadə olunur.
Həmçinin 3.0-da AutoDisposeNotifier və FamilyNotifier bir Notifier sinifində birləşdirilib, Ref isə vahid tipə çevrilib (FutureProviderRef kimi ayrı tiplər aradan qaldırılıb) — bu, generated kodun imzalarını sadələşdirir.
ChangeNotifier-dən AsyncNotifier-ə keçidin mahiyyəti rəsmi migrasiya sənədində belə ifadə olunur: isLoading, hasError kimi əl ilə saxlanan bayraqlar aradan qalxır, çünki AsyncNotifier build-in qaytardığı future-u AsyncValue-ya çevirir — "future-u qaytarmaq kifayətdir". notifyListeners() çağırışına isə ehtiyac qalmır: state-in yeni dəyər alması özü bildirişdir.
📚 Mənbələr və sənədlər
- Provider növləri (Riverpod 3)rəsmiriverpod.dev
Altı provider növünün rəsmi cədvəli və @riverpod sintaksisi.
- Riverpod 3-də nə yenidirrəsmiriverpod.dev
Legacy provider-lərin köçürülməsi, vahid Ref, Notifier-lərin birləşdirilməsi.
- ChangeNotifier-dən migrasiyarəsmiriverpod.dev
isLoading/hasError bayraqlarının AsyncValue ilə əvəzlənməsi — əvvəl/sonra kodu.
- StateNotifier-dən migrasiyarəsmiriverpod.dev