Riverpod — mohiyati, Flutter-da bog'liqliklarni kompilyatsiya qilish

Muallif: IT Sectr Nashr etilgan: 2026-02-19 O'qish vaqti: 7 daq

Riverpod — Flutter uchun kompilyatsiya qilinadigan holat va bog'liqlik menejeri bo'lib, 2021-yilda Rémi Roussel tomonidan Provider vorisi sifatida yaratilgan. Riverpod Provider-ning asosiy muammolarini hal qiladi: kompilyatsiya tekshiruvining yo'qligi, BuildContext-ga bog'liqlik va ProviderNotFoundException bilan qiyinchilik. pub.dev ma'lumotlariga ko'ra, paket 5 mingdan ortiq layk to'plagan va yangi loyihalarda Provider-ni faol ravishda almashtirmoqda.

Asosiy

  • ProviderRef — provider ichida boshqa providerlarga kirish uchun obyekt
  • AsyncValue — loading/error/data holatlari bilan asinxron ma'lumotlar uchun o'ram
  • Notifier — o'zgartirish metodlari bilan mutatsiya qilinadigan holat uchun klass
  • ProviderScope — barcha providerlarni boshqaradigan ildiz vidjet
  • Code Generation — providerlarni avtomatik generatsiya qilish uchun @riverpod annotatsiyalari

Riverpod nima?

Riverpod — Flutter-da holatni boshqarish va bog'liqliklarni kiritish uchun kutubxona bo'lib, provider tavsiflarini xavfsiz Dart kodiga kompilyatsiya qiladi. Provider-dan farqli o'laroq, Riverpod providerlari BuildContext-ga bog'liq emas: ular global yoki ProviderScope ichida yaratiladi va istalgan joydan foydalanish mumkin. Kompilyator qurish bosqichida provider grafigining turlari, bog'liqliklari va yaxlitligini tekshiradi va ProviderNotFoundException kabi runtime xatolarini bartaraf qiladi.

Riverpod test qilish uchun override modelidan foydalanadi: har bir provider subklasslar yaratmasdan yoki interfeyslarni mock qilmasdan ProviderScope.overrideWith orqali bekor qilinishi mumkin. Bu testni izolyatsiya qiladi: har bir test to'liq boshqariladigan bog'liqlik grafigining o'z nusxasini oladi.

Flutter Community Survey 2025 ma'lumotlariga ko'ra, Riverpod mashhurlik bo'yicha Provider va BLoC-dan keyin uchinchi o'rinda. Shu bilan birga, Riverpod eng tez o'sayotgan paket: 2024-yilda +120% o'rnatish. Asosiy sabablar: kompilyatsiya xavfsizligi, ProviderNotFoundException yo'qligi, AsyncValue orqali asinxronlikning o'rnatilgan qo'llab-quvvatlanishi.

Provider turlari

Riverpod har biri muayyan stsenariy uchun 8 turdagi providerlarni taqdim etadi: Provider (doimiy/xizmat), StateProvider (sodda holat), StateNotifierProvider (StateNotifier bilan murakkab mantiq), ChangeNotifierProvider (Provider-dan migratsiya uchun), FutureProvider (asinxron ma'lumotlar, bir marta), StreamProvider (reaktiv oqim), NotifierProvider (yangi API, Flutter 3.10+) va AsyncNotifierProvider (asinxron Notifier).

Dart
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
  return CounterNotifier();
});

class CounterNotifier extends StateNotifier<int> {
  CounterNotifier() : super(0);

  void increment() => state++;
  void decrement() => state--;
}

class CounterScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final count = ref.watch(counterProvider);
    return Text('$count');
  }
}

ProviderRef — har bir providerga boshqa providerlarga kirish uchun uzatiladigan obyekt. ref.watch — o'zgarishlarga obuna bo'lish, ref.read — bir martalik o'qish, ref.invalidate — kesheni qayta tiklash. ProviderRef Provider-dagi BuildContext o'rnini bosadi: istalgan provider vidjet daraxtiga kirmasdan boshqa providerlarni o'qiy oladi. Bu UI qatlamidan tashqarida bog'liqlik grafigini qurish imkonini beradi.

ProviderScope — Riverpod ishlashi uchun majburiy bo'lgan ildiz vidjet. ProviderScope barcha providerlarni saqlaydi, ularning hayot aylanishini boshqaradi va qiymatlarni keshlaydi. ProviderScope bo'lmasa, dastur ProviderNotFoundException bilan ishdan chiqadi. ProviderScope ichma-ich bo'lishi mumkin — ichki scope ota-ona providerlarini bekor qiladi, bu test va funksiyalarni izolyatsiya qilish uchun ishlatiladi.

AsyncValue va asinxronlik bilan ishlash

AsyncValue — asinxron holatni ifodalash uchun Riverpod-ning sealed klassi. AsyncValue uch variantga ega: AsyncData (muvaffaqiyatli ma'lumot), AsyncError (xato), AsyncLoading (yuklanmoqda). loading/error/data o'rtasida qo'lda o'tish o'rniga, har bir FutureProvider yoki StreamProvider avtomatik ravishda AsyncValue qaytaradi va vidjet ref.watch orqali uchala holatni ham boshqaradi.

Dart
final userProvider = FutureProvider((ref) async {
  final api = ref.watch(apiProvider);
  return await api.fetchUser();
});

class UserScreen extends ConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final userAsync = ref.watch(userProvider);
    return userAsync.when(
      data: (user) => UserWidget(user),
      error: (e, _) => ErrorWidget(e.toString()),
      loading: () => CircularProgressIndicator(),
    );
  }
}

AsyncValue.when — uchala holatning naqshini moslashtirish uchun metod. Kompilyator barcha uch holatning ishlanganligini tekshiradi — agar loading yoki error unutilsa, kod kompilyatsiya qilinmaydi. AsyncValue.whenData — faqat data uchun (agar loading/error kerak bo'lmasa). AsyncValue.guard — istisnoni AsyncError-ga aylantirish uchun try-catch o'rami. keepAlive — ko'rinish doirasidan chiqishda provider keshesining yo'q qilinishini oldini oluvchi bayroq.

Code Generation va @riverpod

Kodgeneratsiya — Riverpod 2.0+ ning asosiy xususiyati. Funksiya ustidagi @riverpod annotatsiyasi avtomatik ravishda to'g'ri turga ega, refaktoring qo'llab-quvvatlashi va avtoto'ldirish bilan provider yaratadi. Kodgeneratsiya riverpod_generator va build_runner dan foydalanadi. Dasturchi sof funksiya yozadi, qolgan hamma narsa — turlar, klasslar, fabrika konstruktorlari — avtomatik generatsiya qilinadi.

Dart
@riverpod
String helloWorld(HelloWorldRef ref) {
  return 'Hello World';
}

// Yaratildi: final helloWorldProvider = Provider((ref) => 'Hello World');

@riverpod
class Counter extends _$Counter {
  int build() => 0;
  void increment() => state++;
}

Notifier — kodgeneratsiya bilan mutatsiya qilinadigan holat uchun yangi API. Notifier build() metodi va holatni o'zgartiruvchi metodlarga ega klass. StateNotifier-dan farqli o'laroq, Notifier alohida holat klassini talab qilmaydi va getter/setter orqali state ga to'g'ridan-to'g'ri kirish imkonini beradi. Riverpod @riverpod annotatsiyasiga ega har bir Notifier klassi uchun avtomatik NotifierProvider yaratadi.

build_runner: kodgeneratsiya dart run build_runner build buyrug'i bilan ishga tushiriladi. Generatsiya qilingan fayllar .g.dart suffiksiga ega va manba kodiga import qilinadi. Annotatsiyalar yoki provider turlari o'zgarganda kodgeneratsiyani qayta ishga tushirish kerak. Riverpod 2.x barcha yangi loyihalar uchun kodgeneratsiyani tavsiya qiladi — providerlarni qo'lda yaratish eskirgan.

Riverpod vs Provider

Asosiy farqlar Riverpod va Provider o'rtasida: BuildContext-dan mustaqillik, kompilyatsiya xavfsizligi, asinxronlik bilan o'rnatilgan ishlash, avtomatik keshlash va override orqali test qilish. Provider holatga kirish uchun BuildContext talab qiladi (context.watch, context.read), Riverpod WidgetRef va global e'lon qilingan providerlardan foydalanadi.

XususiyatProviderRiverpod
BuildContext-ga bog'liqlikHaYo'q
Kompilyatsiya tekshiruviYo'qHa (@riverpod orqali)
ProviderNotFoundExceptionRuntimeMumkin emas
AsinxronlikQo'ldaAsyncValue (o'rnatilgan)
Test qilishProvider ichida o'ramProviderScope.overrideWith
KeshlashYo'qAvtomatik + keepAlive

Provider-dan migratsiya: Riverpod mavjud ChangeNotifier-larni qayta yozmasdan ishlatish uchun ChangeNotifierProvider.adaptive ni qo'llab-quvvatlaydi. Bosqichma-bosqich migratsiya: avval yangi funksiyalar Riverpod-da yoziladi, keyin eski Provider-lar adapter orqali Riverpod providerlari bilan almashtiriladi. Ikkala paket bir loyihada birga mavjud bo'lishi mumkin, bu rivojlanishni to'xtatmasdan migratsiya qilish imkonini beradi.

Riverpod-ni test qilish

Riverpod-ni test qilish ProviderScope.overrideWith ga asoslangan. Har bir provider mock va DI konteynerlarisiz test ProviderScope ichida bekor qilinadi. ProviderContainer — Fluttersiz (sof Dart) testlar uchun izolyatsiya qilingan muhit bo'lib, vidjetlarni ko'rsatmasdan providerlarni test qilish imkonini beradi.

Dart
import 'package:flutter_test/flutter_test.dart';
import 'package:riverpod/riverpod.dart';

void main() {
  test('Counter increments correctly', () {
    final container = ProviderContainer();
    container.read(counterProvider.notifier).increment();
    expect(container.read(counterProvider), 1);
  });

  testWidgets('UI updates on increment', (tester) async {
    await tester.pumpWidget(
      ProviderScope(
        overrides: [counterProvider.overrideWithValue(5)],
        child: CounterScreen(),
      ),
    );
    expect(find.text('5'), findsOneWidget);
  });
}

ProviderContainer — Fluttersiz. ProviderContainer-dan vidjetlarsiz providerlarning birlik testlari uchun foydalaning. overrideWithValue — providerni aniq qiymat bilan almashtirish. overrideWith — provider fabrikasi bilan almashtirish (xizmatlarni mock qilish uchun). autodispose — testlarda providerning ko'rinish doirasidan chiqishda container.dispose() bilan yo'q qilinishini tekshiring.

Tez-tez beriladigan savollar

Riverpod BLoC-dan nimasi bilan farq qiladi?

Riverpod — global providerlar, AsyncValue va kodgeneratsiya bilan holatni boshqarish kutubxonasi. BLoC — Event → Stream → State bilan arxitektura namunasi. Riverpod o'rganish osonroq va @riverpod annotatsiyalari orqali yaxshiroq DX taqdim etadi. BLoC biznes mantiqining qattiq izolyatsiyasini va BlocObserver orqali Event kuzatuvini beradi. Tanlov loyiha paradigmasiga bog'liq: Riverpod Provider-ga yaqinroq, BLoC — reaktiv oqimlarga.

Riverpod-da autodispose nima?

Autodispose — hech kim obuna bo'lmaganda providerning avtomatik yo'q qilinishi mexanizmi. Odatiy bo'lib, barcha Riverpod providerlari autodispose: vidjet daraxtdan chiqqanda provider xotiradan o'chiriladi. keepAlive — doim yashashi kerak bo'lgan providerlar (API mijozlari, repozitoriylar, sozlamalar) uchun autodispose-ni o'chiruvchi bayroq. Bu xotira oqishining oldini oladi — foydalanilmayotgan providerlar avtomatik yo'q qilinadi.

ref.invalidate qanday ishlaydi?

ref.invalidate — provider keshesini majburiy qayta tiklovchi metod. invalidate-dan keyin navbatdagi o'qishda provider qayta yaratiladi: FutureProvider async funksiyani qayta bajaradi, StreamProvider oqimga qayta obuna bo'ladi. Ma'lumotlarni majburiy yangilash uchun invalidate-dan foydalaning (pull-to-refresh, foydalanuvchi o'zgarishi). ref.refresh — invalidate + o'qish kombinatsiyasi: kesheni qayta tiklaydi va darhol yangi qiymatni bir operatsiyada o'qiydi.

Riverpod-dan kodgeneratsiyasiz foydalanish mumkinmi?

Ha. Riverpod 1.x faqat kodgeneratsiyasiz ishlaydi — providerlar qo'lda Provider(), StateNotifierProvider(), FutureProvider() va h.k. orqali yaratiladi. Riverpod 2.x ikkala yondashuvni qo'llab-quvvatlaydi. Kodgeneratsiyasiz ko'proq boilerplate bor, lekin build_runner va dart run build_runner build-ga bog'liqlik yo'q. Kichik loyihalar (30 providergacha) uchun qo'lda yaratish oqlanadi, katta loyihalar uchun kodgeneratsiya majburiy.

Family-providerlar nima?

Family — tashqi parametr qabul qiluvchi provider modifikatori. Masalan, userProvider(123) — ID 123 bo'lgan foydalanuvchini yuklovchi provider. Family-providerlar har bir unikal parametr uchun natijani alohida keshlaydi. Family-dan har bir element ID bo'yicha yuklanadigan elementlar ro'yxati uchun foydalaning. Family modifikatori barcha provider turlari uchun mavjud: Provider.family, FutureProvider.family, StreamProvider.family.

Xulosa

  • Riverpod — ProviderNotFoundException-siz Provider vorisi bo'lgan kompilyatsiya qilinadigan holat menejeri
  • ProviderRef — boshqa providerlar ichida providerlarga kirish uchun BuildContext o'rnini bosuvchi
  • AsyncValue — asinxron ma'lumotlar uchun loading/error/data holatlari bilan sealed klass
  • @riverpod kodgeneratsiyasi — turlar va provider fabrikalarining avtomatik xulosasi
  • ProviderScope.overrideWith — mock va DI konteynerlarisiz izolyatsiya qilingan test
  • Family — individual keshlash bilan parametrlashgan providerlar
  • autodispose va keepAlive — providerlarning hayot aylanishini avtomatik boshqarish

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing