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 — Flutter में स्थिति प्रबंधन और निर्भरता इंजेक्शन के लिए एक पैकेज, जो InheritedWidget के ऊपर बनाया गया है। Provider विजेट ट्री में एक वस्तु (स्थिति, सेवा, रिपॉजिटरी) प्रदान करता है और डेटा बदलने पर स्वचालित रूप से UI का पुनर्निर्माण करता है। InheritedWidget के सीधे उपयोग के विपरीत, Provider सारे boilerplate को हटा देता है: InheritedWidget का उपवर्ग लिखने, स्थैतिक of() विधि सेट करने या नेस्टिंग प्रबंधित करने की आवश्यकता नहीं है।

Provider Google द्वारा Flutter में स्थिति प्रबंधन का आधिकारिक रूप से अनुशंसित तरीका है (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 — जब अनुकूलन के लिए child विजेट की आवश्यकता हो। watch — सरल पढ़ने के लिए build विधि में। select — जब मॉडल में कई फील्ड हों लेकिन विजेट केवल एक पर निर्भर हो। Provider विजेट नष्ट होने पर स्वचालित रूप से सब्सक्रिप्शन रद्द कर देता है, मेमोरी लीक को रोकता है।

MultiProvider और ProxyProvider

MultiProvider — बिना नेस्टिंग के कई Provider पंजीकृत करने के लिए विजेट। 5 स्तरों वाले Provider → Provider → Provider ट्री के बजाय, MultiProvider प्रदाताओं की एक सूची लेता है। प्रत्येक बाद वाला 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 अन्य प्रदाताओं से मान प्राप्त करता है और उन्हें अपनी वस्तु को भेजता है। उदाहरण के लिए, 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 (lazy निर्माण के लिए) और ChangeNotifierProvider.create (स्पष्ट lazy निर्माण के लिए)।

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 — प्रतिक्रियाशील UI अपडेट के लिए notifyListeners वाला वर्ग
  • Consumer और context.watch — स्वचालित पुनर्निर्माण के साथ परिवर्तनों पर सब्सक्रिप्शन
  • MultiProvider — ट्री नेस्टिंग के बिना प्रदाताओं का संयोजन
  • ProxyProvider — Provider के बीच निर्भरता श्रृंखला
  • context.select — मॉडल के किसी विशेष फील्ड पर लक्षित सब्सक्रिप्शन
  • StreamProvider और FutureProvider — प्रतिक्रियाशील और एसिंक्रोनस डेटा के लिए अंतर्निहित समर्थन

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें