Sparround

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ə bilirmidə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 oxunurDəyişdirilir (notifier)
Sinxron`Provider``NotifierProvider` (`Notifier<T>`)
`Future``FutureProvider``AsyncNotifierProvider` (`AsyncNotifier<T>`)
`Stream``StreamProvider``StreamNotifierProvider` (`StreamNotifier<T>`)
dart
// 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, StateNotifierProviderChangeNotifierProvider 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 AutoDisposeNotifierFamilyNotifier 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