Sparround

autoDispose, keepAlive və family

Riverpod-un ən çox səhv anlaşılan iki modifikatoru state-in ömrüparametrləri ilə bağlıdır.

autoDispose — provider-i istifadə edən dinləyici qalmadıqda state-in təmizlənməsi. Sənədin təsvirinə görə Riverpod dinləyicilərin sayını izləyir; sayğac sıfıra çatanda provider "istifadə olunmayan" sayılır. Ardınca ref.onCancel dərhal işləyir, bir frame gözlənilir, provider yenə istifadəsiz qalırsa ref.onDispose çağırılır və state silinir. Kod generasiyası ilə yazılan provider-lərdə bu davranış default olaraq aktivdir; söndürmək üçün @Riverpod(keepAlive: true) yazılır. Əl ilə yazılan provider-lərdə 3.x sənədi isAutoDispose: true parametrini göstərir.

family — provider-ə arqument ötürməyə imkan verən modifikator. Riverpod hər arqument üçün ayrı state saxlayır, ona görə arqument ==/hashCode baxımından sabit olmalıdır (dəyər tipləri, record-lar, immutable modellər).

dart
// Kod generasiyası ilə: parametrlər funksiyanın arqumentləridir,
// autoDispose default olaraq aktivdir.
@riverpod
Future<Product> product(Ref ref, String id) {
  return ref.watch(catalogRepositoryProvider).fetch(id);
}

// İstifadə: hər id ayrı provider instansiyasıdır.
final product = ref.watch(productProvider('sku-42'));

// Kod generasiyası olmadan: family modifikatoru, bir pozisional arqument.
final productProviderManual = FutureProvider.family<Product, String>(
  (ref, id) => ref.watch(catalogRepositoryProvider).fetch(id),
);

// keepAlive: uğurlu nəticəni cache-də saxlamaq, xətanı saxlamamaq.
@riverpod
Future<Config> config(Ref ref) async {
  final result = await ref.watch(apiClientProvider).loadConfig();
  ref.keepAlive(); // yalnız uğurlu hala çatdıqda cache-i qoruyur
  return result;
}

family + autoDispose: hər id üçün ayrı cache, istifadəsiz qalanda təmizlənir.

VəziyyətTövsiyəSəbəb
Provider parametr (family) qəbul edirautoDispose aktiv olsunSənədin tövsiyəsi: əks halda hər arqument kombinasiyası üçün state yığılır
Tətbiq boyu lazım olan konfiqurasiya, auth`@Riverpod(keepAlive: true)`Hər ekran keçidində yenidən yükləmək mənasızdır
Ağır sorğunun nəticəsi, lakin yalnız uğurlu halautoDispose + şərtlə `ref.keepAlive()`Xəta cache-də qalmır, uğurlu nəticə qalır
Ekranın müvəqqəti state-i (filtr, seçim)autoDispose — və ya ümumiyyətlə provider deyilDO/DON'T səhifəsi ephemeral state üçün provider işlətməməyi tövsiyə edir

ref.keepAlive() link qaytarır: link.close() çağırıldıqda avtomatik təmizləmə davranışı bərpa olunur. Yəni cache-i "həmişəlik" deyil, şərtlə saxlamaq mümkündür — məsələn 5 dəqiqədən sonra Timer ilə link.close() çağırıb məlumatı köhnəlmiş elan etmək. Bu detal müsahibədə cache strategiyası mövzusunda güclü arqumentdir.

Riverpod 3-ün əlavə etdiyi bir mexanizm də var: pause/resume. Abunəliyi subscription.pause()subscription.resume() ilə əl ilə idarə etmək mümkündür; sənədə görə görünməyən widget-lər üçün abunəliklər avtomatik dayandırılır. Praktik nəticə: fon ekranındaki StreamProvider boş yerə rebuild tetikləmir.

📚 Mənbələr və sənədlər