Riverpod 2 → 3 keçidi
Riverpod 3 mövcud kodun böyük hissəsini saxlayır, lakin bir sıra vacib dəyişikliklər gətirir. Sənədin "nə yenidir" səhifəsindən əsas bəndlər:
Köhnə API-lar ayrı import-a köçürüldü. StateProvider, StateNotifierProvider və ChangeNotifierProvider istifadəni azaltmaq üçün package:riverpod/legacy.dart-a keçirildi. Onlar geriyə uyğunluq üçün işləməyə davam edir.
Breaking dəyişikliklər:
- Ref və notifier-lər söküldükdən sonra müraciət edildikdə xəta atır.
- Provider-dən çıxan exception-lar daha yaxşı diaqnostika üçün
ProviderExceptioniçərisinə bükülür. AsyncValuesealed oldu;valueOrNullvalueadına dəyişdirildi.- Bütün
updateShouldNotifyimplementasiyaları artıq==müqayisəsindən istifadə edir. AutoDisposeNotifiervəFamilyNotifierbirNotifiersinfində birləşdirildi.- Vahid
Ref:FutureProviderRefkimi provider-ə xas tiplər aradan qaldırıldı.
Yeni imkanlar: avtomatik retry (eksponensial gecikmə ilə), Ref.mounted, pause/resume (görünməyən widget-lər üçün avtomatik dayandırma), təcrübi Mutation mexanizmi və təcrübi offline persistence (riverpod_sqflite kimi implementasiyalarla).
| Dəyişiklik | Praktik təsiri |
|---|---|
| Legacy provider-lər ayrı import-da | Kod sınmır, lakin import əlavə etmək lazım gəlir — bu, tədricən köçürmə üçün siqnaldır |
| `AsyncValue` sealed oldu | `switch` üzərində pattern matching tam yoxlanılır; `valueOrNull` → `value` adı yenilənməlidir |
| Söküldükdən sonra müraciətdə xəta | Əvvəl səssiz keçən səhvlər indi görünür — testlərdə yeni uğursuzluqlar çıxa bilər |
| `ProviderException` bükməsi | Xəta idarəsində tipə görə yoxlama aparan kod yenidən nəzərdən keçirilməlidir |
| Avtomatik retry | Şəbəkə xətalarında UI-ın davranışı dəyişir; xəta ekranı gecikə bilər |
| Notifier siniflərinin birləşməsi | `AutoDisposeNotifier`/`FamilyNotifier` adları ilə yazılmış siniflər yenilənməlidir |
// 1) valueOrNull → value
// v2:
final todos = ref.watch(todosProvider).valueOrNull;
// v3:
final todos = ref.watch(todosProvider).value;
// 2) Legacy provider-lər üçün import
// v3-də StateProvider/StateNotifierProvider/ChangeNotifierProvider:
import 'package:riverpod/legacy.dart';
// və ya yeni yanaşmaya keçid:
final counterProvider = NotifierProvider<Counter, int>(Counter.new);
// 3) Sealed AsyncValue → tam pattern matching
return switch (ref.watch(todosProvider)) {
AsyncValue(:final value?) => TodoList(items: value),
AsyncValue(:final error?) => ErrorView(message: '$error'),
_ => const TodoSkeleton(),
};
// 4) Async-dan sonra provider-in hələ yaşadığını yoxlamaq
class Todos extends AsyncNotifier<List<Todo>> {
@override
Future<List<Todo>> build() => ref.watch(repositoryProvider).fetchAll();
Future<void> refreshQuietly() async {
final result = await ref.read(repositoryProvider).fetchAll();
if (!ref.mounted) return; // v3: söküldükdən sonra müraciət xəta atır
state = AsyncData(result);
}
}Migrasiyada ən çox rastlanan dörd düzəliş.
Migrasiyanın gözlənilməz hissəsi adətən avtomatik retry-dır: sənədə görə provider hesablanarkən exception baş verdikdə 10 dəfəyə qədər, 200 ms-dən 6.4 saniyəyə qədər eksponensial gecikmə ilə təkrar cəhd edilir. Bu, offline halında xəta ekranının gec görünməsinə səbəb ola bilər. retry parametri (provider, ProviderScope və ya ProviderContainer səviyyəsində) davranışı tənzimləməyə, retry: (retryCount, error) => null isə tamamilə söndürməyə imkan verir. Testlərdə vaxt gözləntisi olan hallar üçün bunu bilmək vacibdir.
📚 Mənbələr və sənədlər
- Riverpod 3-də nə yenidirrəsmiriverpod.dev
Bu mövzudaki bütün dəyişikliklərin rəsmi siyahısı.
- 3.0 migrasiya bələdçisirəsmiriverpod.dev
Addım-addım keçid təlimatı.
- Avtomatik retryrəsmiriverpod.dev
- package:flutter_riverpodrəsmipub.dev
Aktual versiya və changelog — versiyaya bağlı iddiaları burada yoxlamaq olar.