Provider: bu nima, Flutter ilovalari holat menejeri

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

Provider — Flutter üçün holatni boshqarish paketi, 2019-yilda Rémi Rousselet tomonidan InheritedWidget üstiga qurilgan. Provider props drilling holda ma'lumotlarni vidjetlar daraxti bo'ylab pastga uzatish muammosini hal qiladi: har qanday vidjet context.read<T>() yoki context.watch<T>() orqali holatga kirishadi. pub.dev ma'lumotlariga köra, Provider 25 mingdan ortiq yoqtirish bilan Flutter-ning eng mashhur holat menejeridir.

Asosiy

  • ChangeNotifier — obunachilarni o'zgarish haqida xabardor qilish üçün notifyListeners bilan sinf
  • Consumer — ChangeNotifier o'zgarganda qayta quriladigan vidjet
  • MultiProvider — ichma-ich joylashtirmasdan bir nechta Provider kompozitsiyasi
  • ProxyProvider — boshqa Provider-ga bog'liq Provider
  • context.read / context.watch — obunasiz va obuna bilan holatni o'qish usullari

Provider nima?

Provider — Flutter-da holatni boshqarish va bog'liqliklarni kiritish üçün InheritedWidget asosida qurilgan paket. Provider vidjetlar daraxtida obyektni (holat, xizmat, repository) taqdim etadi va ma'lumot o'zgarganda UI-ni avtomatik qayta quradi. To'g'ridan-to'g'ri InheritedWidget ishlatishdan farqli o'laroq, Provider barcha boilerplate-ni olib tashlaydi.

Provider — Google tomonidan Flutter-da holatni boshqarish üçün rasman tavsiya etilgan usul (Flutter Team, 2019-2023). Flutter Community Survey 2025 ma'lumotlariga köra, Provider Flutter ilovalarining 72% ida ishlatiladi.

ChangeNotifier va notifyListeners

ChangeNotifier — Listener namunasini amalga oshiradigan o'rnatilgan Flutter sinfi. ChangeNotifier notifyListeners() chaqiruvi orqali obunachilarni o'zgarish haqida xabardor qiladi.

Dart
class CounterProvider extends ChangeNotifier {
  int _count = 0;
  int get count => _count;

  void increment() {
    _count++;
    notifyListeners();
  }

  void reset() {
    _count = 0;
    notifyListeners();
  }
}

notifyListeners qoidalari: ma'lumotlar to'liq o'zgargandan keyin chaqiring — metod o'rtasida emas, oxirida. Bir nechta o'zgarishlar bo'lsa, har biridan keyin emas, balki barcha o'zgarishlardan keyin bir marta notifyListeners() chaqiring.

Consumer va context.watch

Consumer — ChangeNotifier-ga obuna bo'ladigan va har notifyListeners() chaqiruvida qayta quriladigan vidjet. Consumer üç parametrli builder funksiyasini qabul qiladi: context, model, child.

Dart
Consumer<CounterProvider>(
  builder: (context, provider, child) => Column(
    children: [
      child!, // qayta qurilmaydi
      Text('${provider.count}'),
      ElevatedButton(
        onPressed: () => provider.increment(),
        child: Icon(Icons.add),
      ),
    ],
  ),
  child: Text('Hisoblagich:'),
)

context.watch — Provider-ga obuna bo'lish üçün BuildContext kengaytma metodi. context.read — obunasiz kirish. context.select — modelning ma'lum bir maydoniga obuna.

MultiProvider va ProxyProvider

MultiProvider — ichma-ich joylashtirmasdan bir nechta Provider-ni ro'yxatdan o'tkazish üçün vidjet. MultiProvider providerlar ro'yxatini qabul qiladi.

Dart
MultiProvider(
  providers: [
    ChangeNotifierProvider(create: (_) => CartProvider()),
    ChangeNotifierProvider(create: (_) => AuthProvider()),
    ProxyProvider<AuthProvider, OrderProvider>(
      update: (_, auth, __) => OrderProvider(auth.userId),
    ),
  ],
  child: MaterialApp(home: HomePage()),
)

ProxyProvider — boshqa Provider-ga bog'liq Provider. StreamProvider va FutureProvider — reaktiv va asinxron ma'lumotlar üçün.

Provider-ni test qilish

Provider test qilinadi vidjetni test qiymatlari bilan MultiProvider-ga o'rash orqali. Test üçün haqiqiy API yoki ma'lumotlar bazasi kerak emas.

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

void main() {
  testWidgets('Counter increments on button tap',
    (tester) async {
      await tester.pumpWidget(
        ChangeNotifierProvider(
          create: (_) => CounterProvider(),
          child: CounterScreen(),
        ),
      );
      await tester.tap(find.byKey(Key('increment')));
      await tester.pump();
      expect(find.text('1'), findsOneWidget);
    },
  );
}

Provider: samaradorlik va cheklovlar

Provider samaradorligi InheritedWidget-ga asoslanadi: Provider o'zgarganda, context.watch yoki Consumer orqali obuna bo'lgan barcha vidjetlar qayta quriladi. context.select, Consumer child parametri bilan va const dan foydalaning.

MetodObunaQayta qurishIshlatish
context.watchTo'liq modelHar qanday o'zgarishOddiy vidjetlar
ConsumerTo'liq modelHar qanday o'zgarishChild optimallashtirish bilan
context.selectAniq maydonFaqat maydon o'zgargandaMurakkab modellar
context.readYo'qHech qachonHodisa handlerlari

Tez-tez beriladigan savollar

Provider BLoC-dan qanday farq qiladi?

Provider — ChangeNotifier bilan bog'liqliklarni kiritish üçün InheritedWidget üstidagi qobiq. BLoC — mantiqni izolyatsiya qilish üçün Event + Stream arxitektura namunasi.

ChangeNotifierProvider nima?

ChangeNotifierProvider — ChangeNotifier namunalari üçün Provider turi. create orqali obyekt yaratadi, uni avlodlarga taqdim etadi va notifyListeners chaqirilganda Consumer-ni qayta quradi.

Provider bilan keraksiz qayta qurishdan qanday qochish mumkin?

context.select dan foydalaning. Katta ChangeNotifier-larni bir nechta kichiklarga bo'ling. Statik qismlar üçün Consumer child dan foydalaning.

Provider-ni ChangeNotifiersiz ishlatish mumkinmi?

Ha. Provider o'zgarmas obyektlar üçün. StreamProvider oqimlar üçün. FutureProvider Future üçün. ProxyProvider boshqa Provider-larga bog'liq Provider-lar üçün.

ProviderNotFoundException nima?

ProviderNotFoundException — vidjetlar daraxtida yuqoriroqda e'lon qilinmagan Provider-ni olishga urinishda yuzaga keladigan ish vaqti istisnosi.

Xulosa

  • Provider — Flutter-da holatni boshqarish va DI üçün InheritedWidget üstidagi qobiq
  • ChangeNotifier — UI-ni reaktiv yangilash üçün notifyListeners bilan sinf
  • Consumer va context.watch — avtomatik qayta qurish bilan o'zgarishlarga obuna
  • MultiProvider — daraxtni ichma-ich joylashtirmasdan providerlar kompozitsiyasi
  • ProxyProvider — Provider-lar o'rtasidagi bog'liqlik zanjiri
  • context.select — modelning ma'lum maydoniga nuqtali obuna
  • StreamProvider va FutureProvider — reaktiv va asinxron ma'lumotlar üçün o'rnatilgan qo'llab-quvvatlash

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