autoDispose, keepAlive və family
Riverpod-un ən çox səhv anlaşılan iki modifikatoru state-in ömrü və 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).
// 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ət | Tövsiyə | Səbəb |
|---|---|---|
| Provider parametr (family) qəbul edir | autoDispose aktiv olsun | Sə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 hal | autoDispose + şə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 deyil | DO/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() və 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
- autoDisposerəsmiriverpod.dev
Dinləyici sayğacı, bir frame gözləmə, ref.keepAlive() və link mexanizmi burada.
- familyrəsmiriverpod.dev
Parametrlərin ötürülməsi və hər arqument üçün ayrı state.
- Riverpod 3: pause/resume və digər yeniliklərrəsmiriverpod.dev
- Provider növləri və modifikatorlarrəsmiriverpod.dev