Provider: یہ کیا ہے، Flutter ایپ سٹیٹ مینجر

مصنف: IT Sectr اشاعت: 2026-02-19 مطالعے کا وقت: 7 منٹ

Provider — Flutter کے لیے سٹیٹ مینجمنٹ پیکیج، جو Remi Rousselet نے 2019 میں InheritedWidget کے اوپر ایک ریپر کے طور پر بنایا تھا۔ Provider props drilling کے بغیر واجیٹ ٹری میں نیچے ڈیٹا بھیجنے کے مسئلے کو حل کرتا ہے: کوئی بھی واجیٹ context.read<T>() یا context.watch<T>() کے ذریعے سٹیٹ تک رسائی حاصل کر سکتا ہے۔ pub.dev کے مطابق، Provider 25 ہزار سے زائد لائکس کے ساتھ Flutter کا سب سے مقبول سٹیٹ مینجر ہے۔

اہم نکات

  • ChangeNotifier — سبسکرائبرز کو تبدیلیوں کی طرف متنبہ کرنے کے لیے notifyListeners والی ایک کلاس
  • Consumer — ایک واجیٹ جو ChangeNotifier بدلنے پر دبارہ تعمیر کرتا ہے
  • MultiProvider — بغیر نیڈنگ کے متعدد Provider کا مرکب
  • ProxyProvider — ایک Provider جو دوسرے Provider پر منحصر کرتا ہے
  • context.read / context.watch — سبسکرپشن کے بغیر اور ساتھ سٹیٹ پڑھنے کے طریقے

Provider کیا ہے؟

Provider — InheritedWidget کے اوپر بنا ہوا، Flutter میں سٹیٹ مینجمنٹ اور انحصاری انجیکشن کے لیے ایک پیکیج ہے۔ Provider واجیٹ ٹری میں ایک آبجیکٹ (سٹیٹ، سروس، ریپوزٹٹری) فراہم کرتا ہے اور ڈیٹا بدلنے پر خودکار طور پر UI کو دبارہ تعمیر کرتا ہے۔ InheritedWidget کے براہ راست استعمال کے برخلاف، Provider تمام boilerplate کو ختم کر دیتا ہے: InheritedWidget کا ذیلی طبقہ لکھنے، سٹٹک of() میتھڈ ترتیب دینے یا نیڈنگ کا انتظام کرنے کی ضرورت نہیں ہے۔

Provider Flutter میں سٹیٹ مینجمنٹ کا Google کی طرف سے سرکاری طور پر تجویز کردہ طریقہ ہے (Flutter Team، 2019-2023)۔ یہ پیکیج Flutter Ecosystem کا حصہ ہے اور Flutter ٹیم کے ذریعے برقرار ہے۔ اپنے آغاز کے وقت، Provider کو گلوبل متغیرات اور InheritedWidget کے متبادل کے طور پر تجویز کیا گیا تھا: کوئی بھی آبجیکٹ کنسٹرکٹر کے ذریعے گزرنے کے بغیر کہیں سے بھی قابل رسائی ہے۔

Flutter Community Survey 2025 کے مطابق، Provider 72% Flutter ایپلیکیشنز میں استعمال ہوتا ہے۔ اسکی مقبولیت کی اهم وجوہات: کم سے کم داخلی حد، مضمونی ChangeNotifier تعاون، دیگر آرکیٹیکچرز (MVVM، BLoC) کے ساتھ مطابقت اور بیرونی انحصارات کی غیر موجودگی۔

ChangeNotifier اور notifyListeners

ChangeNotifier — Flutter کی مضمونی کلاس جو Listener پیٹرن نفذ کرتی ہے۔ ChangeNotifier notifyListeners() کو کال کرکے سبسکرائبرز کو تبدیلیوں کے بارے میں متنبہ کرتا ہے۔ Provider کے سیاق میں، ChangeNotifier حالت کے لیے مرکزی کلاس ہے: ChangeNotifier کو وسیع کرنے والی ایک کلاس فیلڈز اور میتھڈز کے ساتھ بنائی جاتی ہے جو ڈیٹا بدلنے کے بعد notifyListeners() کو کال کرتے ہیں۔

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

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

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

notifyListeners کے قواعد: ڈیٹا کو مکمل طور پر بدلنے کے بعد کال کریں — میتھڈ کے درمیان نہیں، بلکہ آخر میں۔ اگر کوئی میتھڈ متعدد تبدیلیاں کرتا ہے، تو ہر تبدیلی کے بعد نہیں، بلکہ تمام تبدیلیوں کے بعد ایک بار notifyListeners() کال کریں۔ یہ ایک منطقی قدم میں متعدد دبارہ ریڈرائینگ کو روکتا ہے۔ بیچ اپڈیٹز کے لیے، setState جیسے پیٹرنز کے ساتھ notifyListeners استعمال کریں۔

ChangeNotifier کے متبادل: ValueNotifier — ایک قیمت کے لیے (پرائیمٹو کے لیے اچھا)، StateNotifierstate_notifier پیکیج سے (شاز۔ ہی اکیلا استعمال ہوتا ہے)۔ اکثر Provider حل اپنے مضمونی تعاون اور سادگی کی وجہ سے ChangeNotifier استعمال کرتے ہیں۔

Consumer اور context.watch

Consumer — ایک واجیٹ جو ChangeNotifier پر سبسکرائب کرتا ہے اور ہر notifyListeners() کال پر دبارہ تعمیر کرتا ہے۔ Consumer تین پارامیٹرز کے ساتھ ایک builder فنکشن لیتا ہے: context، model، child۔ Child — ایک واجیٹ جو موڈل پر منحصر نہیں کرتا اور Consumer اسے دبارہ تعمیر نہیں کرتا۔ یہ ایک بہترین کارکردگی ہے: اگر Consumer میں ایک ستیٹک واجیٹ (آئیکن، ڈیٹا کے بغیر متن) ہے، تو اسے child کے ذریعے گزارا جاتا ہے اور دبارہ نہیں بنایا جاتا۔

Dart
Consumer<CounterProvider>(
  builder: (context, provider, child) => Column(
    children: [
      child!, // دبارہ تعمیر نہیں ہوتا
      Text('${provider.count}'),
      ElevatedButton(
        onPressed: () => provider.increment(),
        child: Icon(Icons.add),
      ),
    ],
  ),
  child: Text('کاؤنٹر:'),
)

context.watch — Provider پر سبسکرائب کرنے کے لیے BuildContext کا ایک توسیعی میتھڈ ہے۔ موڈل واپس کرتا ہے اور موجودہ واجیٹ کو اسکی تبدیلیوں پر سبسکرائب کرتا ہے۔ context.read — سبسکرپشن کے بغیر رسائی (onPressed ہینڈلرز، initState اور dispose کے لیے)۔ context.select — دیگر فیلڈز کے بدلنے پر دبارہ تعمیر کیے بغیر موڈل کے ایک مخصوص فیلڈ پر سبسکرائب۔ Select 10+ فیلڈز والے مختلف ماڈلز کے لیے سب سے موثر اوپشن ہے۔

Consumer، watch یا select کب استعمال کریں: Consumer — جب بہترین کارکردگی کے لیے ایک چائلڈ واجیٹ کی ضرورت ہو۔ watch — سادہ پڑھنے کے لیے build میتھڈ میں۔ select — جب موڈل کے متعدد فیلڈ ہوں لیکن واجیٹ صرف ایک پر منحصر کرتا ہو۔ Provider واجیٹ تباہ ہونے پر خودکار طور پر سبسکرپشن منسوخ کر دیتا ہے، میموری لیک کو روکتا ہے۔

MultiProvider اور ProxyProvider

MultiProvider — بغیر نیڈنگ کے متعدد Provider رجسٹر کرنے کے لیے ایک واجیٹ ہے۔ Provider → Provider → Provider کے 5 سطیوں کے درخت کے بجائے، MultiProvider فراہم کنندگاں کی ایک فہرست لیتا ہے۔ ہر اگلا Provider کنسٹرکٹر کے ذریعے پځڄلے Provider کو استعمال کر سکتا ہے۔ MultiProvider ایک ایپلیکیشن کی جڑ سطح کو منتظم کرنے کا معیاری طریقہ ہے۔

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

ProxyProvider — ایک Provider جو دوسرے Provider پر منحصر کرتا ہے۔ ProxyProvider دوسرے Provider سے قیمتیں لیتا ہے اور انہیں اپنے آبجیکٹ کو بھیجتا ہے۔ مثال کے طور پر، OrderProvider کا انحصار AuthProvider پر ہے (userId چاہیے)۔ جب AuthProvider بدلتا ہے، ProxyProvider خودکار طور پر نئے userId کے ساتھ OrderProvider کو دبارہ بناتا ہے۔ ChangeNotifierProxyProvider — ChangeNotifier کے لیے ProxyProvider کا ورژن۔

StreamProvider اور FutureProvider: StreamProvider ایک Stream (Firebase، WebSocket) پر سبسکرائب کرتا ہے اور ہر نئے ایونٹ پر Consumer کو اپڈیٹ کرتا ہے۔ FutureProvider — اسانکرونس آغاز کے لیے: ایک Future چلاتا ہے، لوڈنگ دیڤاتا ہے، پھر نتیجہ واجیٹس کو بھیجتا ہے۔ دونوں دستی سبسکرپشن منیجمنٹ کے بغیر بار بار کے کاموں کو حل کرتے ہیں۔

Provider کی آزمائش

Provider کی آزمائش واجیٹ کو تیسٹ قیمتوں کے ساتھ MultiProvider میں لپیٹ کر کی جاتی ہے۔ آزمائش کے لیے کسی حقیقی API یا ڈیٹابیس کی ضرورت نہیں ہے — Provider کو ایک فرضی آبجیکٹ سے بدل دیا جاتا ہے۔ provider پیکیج آزمائش علاحدگی کے لیے ProviderScope فراہم کرتا ہے — ہر آزمائش آزادانہ اپنا خود کا Provider درخت بناتی ہے۔

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);
    },
  );
}

MockProvider: ایک API پر منحصر Provider کے ساتھ واجیٹس کی آزمائش کے لیے، ایک سٹب ذیلی طبقہ بنائیں یا mockito / mocktail استعمال کریں۔ Provider کو کسی خاص فرضی آلات کی ضرورت نہیں ہے — ChangeNotifier کو وسیع کرنے والا کوئی بھی آبجیکٹ حقیقی سروس کو کال کیے بغیر create کے ذریعے پاس کیا جا سکتا ہے۔ آسان متبادل کے لیے انٹرفیسز (تجریدی کلاس) کے ذریعے Provider پروگرام کریں۔

Provider: کارکردگی اور حدود

Provider کی کارکردگی InheritedWidget پر مبنی ہے: جب ایک Provider بدلتا ہے، context.watch یا Consumer کے ذریعے سبسکرائب کیے گئے تمام واجیٹس دبارہ تعمیر ہوتے ہیں۔ ضروری دبارہ ڈرائنگ کو روکنے کے لیے، context.select (ایک مخصوص فیلڈ پر سبسکرپشن)، Consumer child پارامیٹر کے ساتھ اور ستیٹک واجیٹس کے لیے const استعمال کریں۔ Provider تبدیلیوں پر سبسکرائب نہ کینے والی شاخوں کو دبارہ تعمیر نہیں کرتا۔

طریقہسبسکرپشندبارہ تعمیراستعمال
context.watchمکمل موڈلکوئی بھی تبدیلیسادہ واجیٹس
Consumerمکمل موڈلکوئی بھی تبدیلیchild بہترین کارکردگی کے ساتھ
context.selectمخصوص فیلڈصرف تب جب فیلڈ بدلےمختلف ماڈلز
context.readنہیںکبھی نہیںایونٹ ہینڈلرز

حدود: Provider ایونٹ سطح پر کاروباری منطق کو علاحد کرنے (BLoC کی طرح) کی حمایت نہیں کرتا۔ تمام تبدیلیاں ChangeNotifier میتھڈز کے براہ راست کالوں کے ذریعے ہوتی ہیں، جو بے قابو تبدیلی کے سلسلے کا سبب بن سکتے ہیں۔ پیچیدہ مناظر کے لیے (متعدد اسانکرونس کاروائیاں، پیچیدہ تصدیق)، Provider BLoC اور Riverpod کے مقابلے میں کمتر ہے۔

Provider سے منتقلی: Provider دیگر پیکیجز کے ساتھ آسانی سے یکجہ ہو سکتا ہے۔ Riverpod میں منتقل ہونے کے لیے، ChangeNotifierProvider.adaptive استعمال کریں — ایک اڈاپٹر جو موجودہ ChangeNotifier کو دوبارہ لکھے بغیر Riverpod کے ساتھ استعمال کرنے دیتا ہے۔ BLoC کے لیے — BlocProvider کو Provider درخت کے اندر رکھا جا سکتا ہے، آہستہ آہستہ ChangeNotifier کو Bloc سے بدلتا ہے۔

اکثر پوچہ جانے والے سوالات

Provider BLoC سے کیسے مختلف ہے؟

Provider — ChangeNotifier کے ساتھ انحصاری انجیکشن کے لیے InheritedWidget پر ایک ریپر۔ BLoC — منطق علاحدگی کے لیے Event + Stream کے ساتھ ایک آرکیٹیکچرل پیٹرن۔ Provider سیڣھنا آسان ہے، BLoC کوڈ کو مزید سختی سے ساختار دیتا ہے۔ Provider چھوٹی ایپلیکیشنز اور UI سٹیٹ کے لیے موزوں ہے، BLoC پیچیدہ کاروباری منطق کے لیے۔ Flutter Community 2025 کے مطابق، دونوں اکثر ایک ہی منصوبے میں ایک ساتھ استعمال ہوتے ہیں۔

ChangeNotifierProvider کیا ہے؟

ChangeNotifierProvider — ChangeNotifier انسٹنسز کے لیے Provider کی ایک قسم ہے۔ create کے ذریعے آبجیکٹ بناتا ہے، اسے نسلوں کو فراہم کرتا ہے اور notifyListeners کال ہونے پر Consumer کو دبارہ تعمیر کرتا ہے۔ ChangeNotifierProvider درخت سے ہٹانے پر ChangeNotifier پر خودکار طور پر dispose کال کرتا ہے۔ تین تخلیقی طریقے ہیں: ChangeNotifierProvider.value (موجودہ آبجیکٹ کے لیے)، ChangeNotifierProvider (سست تخلیق کے لیے) اور ChangeNotifierProvider.create (واضح سست تخلیق کے لیے)۔

Provider کے ساتھ ضروری دبارہ تعمیر سے کیسے بچیں؟

context.watch کے بجائے context.select استعمال کریں — واجیٹ صرف اس وقت دبارہ تعمیر ہوتا ہے جب منتخب فیلڈ بدلتا ہے۔ بڑے ChangeNotifier کو کئی چہوٹے میں تقسیم کریں (ایک موڈل — ایک ذمہ داری)۔ ستیٹک حصون کے لیے Consumer child استعمال کریں۔ فہرستوں کے لیے، کنجیوں کے ساتھ ListView.builder استعمال کریں۔ Provider DevTools (Flutter Inspector) دیڤاتا ہے کے کون سے واجیٹس دبارہ تعمیر ہو رہے ہیں اور کیوں۔

کیا Provider کو ChangeNotifier کے بغیر استعمال کیا جا سکتا ہے؟

جی ہاں۔ Provider (ChangeNotifier کے بغیر) — ناقابل تبدیل آبجیکٹس (ریپوزٹٹری، API کلائینٹ، ترتیب) کو انجیکٹ کرنے کے لیے۔ ValueListenableProvider — ValueNotifier کے لیے۔ StreamProvider — Stream (Firebase، WebSocket) کے لیے۔ FutureProvider — Future (شروع پر ترتیب لوڈ کرنا) کے لیے۔ ProxyProvider — ان Provider کے لیے جو دوسرے Provider پر منحصر کرتے ہیں۔ ChangeNotifier صرف UI اپڈیٹ کے ساتھ قابل تبدیل سٹیٹ کے لیے ضروری ہے۔

ProviderNotFoundException کیا ہے؟

ProviderNotFoundException — ایک رن ٹائم استثناء جو اس وقت ہوتا ہے جب ایک Provider حاصل کرنے کی کوشش کی جاتی ہے جو واجیٹ ٹری میں اوپر اعلان نہیں کیا گیا تھا۔ عام وجوہات: Provider اس واجیٹ سے نیچے اعلان کیا گیا ہے جو اسے پڑھنے کی کوشش کر رہا ہے؛ Provider ایک روٹ میں اعلان کیا گیا اور دوسرے میں پڑھا جا رہا ہے؛ قسم میں ہجء۔ حل: Provider کو درخت میں اوپر لے جائیں یا عالمی انحصارات کے لیے MaterialApp سطح پر MultiProvider استعمال کریں۔

خلاصہ

  • Provider — Flutter میں سٹیٹ مینجمنٹ اور DI کے لیے InheritedWidget پر ایک ریپر
  • ChangeNotifier — ریاکٹو اپڈیٹز کے لیے notifyListeners والی ایک کلاس
  • Consumer اور context.watch — خودکار دبارہ تعمیر کے ساتھ تبدیلیوں کی سبسکرپشن
  • MultiProvider — درخت نیڈنگ کے بغیر فراہم کنندگاں کا مرکب
  • ProxyProvider — Provider کے درمیان انحصار کا سلسلہ
  • context.select — موڈل کے ایک مخصوص فیلڈ پر ہدفی سبسکرپشن
  • StreamProvider اور FutureProvider — ریاکٹو اور اسانکرونس ڈیٹا کے لیے مضمونی تعاون

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں