GetX — Flutter के लिए एक हल्का माइक्रो-फ्रेमवर्क जो राज्य प्रबंधन, नेविगेशन और निर्भरता इंजेक्शन को एक पैकेज में जोड़ता है। अमीर हुसैन अब्दोराशिदी द्वारा विकसित, GetX न्यूनतम boilerplate प्रदान करता है: कोई Stream नहीं, कोई ChangeNotifier नहीं, नेविगेशन के लिए कोई BuildContext नहीं। pub.dev के अनुसार, GetX ने 13 हज़ार से अधिक लाइक प्राप्त किए हैं, जो सबसे लोकप्रिय Flutter पैकेजों में से एक बन गया है।
मुख्य बिंदु
GetX — Flutter के लिए एक ऑल-इन-वन माइक्रो-फ्रेमवर्क जो तीन मुख्य विकास कार्यों को हल करता है: राज्य प्रबंधन, नेविगेशन (रूटिंग), और निर्भरता इंजेक्शन (DI)। GetX को Stream, ChangeNotifier, Builders या सब्सक्रिप्शन की आवश्यकता नहीं है — सभी प्रतिक्रियाशीलता GetValue और GetStream पर आधारित Rx रैपर द्वारा प्रदान की जाती है, जो ChangeNotifier से दस गुना तेज़ काम करते हैं।
GetX को Provider + Navigator + get_it/kiwi संयोजन के विकल्प के रूप में स्थापित किया गया है। तीन अलग-अलग पैकेज स्थापित करने और 10 पंक्तियाँ कॉन्फ़िगरेशन लिखने के बजाय, GetX एक पंक्ति के साथ सब कुछ तुरंत प्रदान करता है: GetMaterialApp के बजाय MaterialApp। नेविगेशन Get.to(NextScreen()) के माध्यम से BuildContext के बिना काम करता है, और DI Get.put(Service()) के माध्यम से Provider ट्री के बिना काम करता है।
Flutter Community Survey 2025 के अनुसार, GetX का उपयोग 43% Flutter परियोजनाओं में किया जाता है। इसे चुनने के मुख्य कारण: न्यूनतम प्रवेश सीमा (सीखने में 5 मिनट), कोई boilerplate नहीं (Provider या BLoC की तुलना में कोड 60-70% कम हो जाता है), और तेज़ MVP विकास। आलोचक जिम्मेदारियों के पृथक्करण सिद्धांत के उल्लंघन और डिबगिंग जटिलता पर ध्यान देते हैं।
Obx — एक प्रतिक्रियाशील GetX विजेट जो Rx वेरिएबल्स बदलने पर पुनर्निर्माण करता है। Obx को सब्सक्रिप्शन, dispose या Builder फ़ंक्शन की आवश्यकता नहीं है — बस विजेट को Obx में लपेटें और अंदर Rx वेरिएबल का उपयोग करें। Obx स्वचालित रूप से ट्रैक करता है कि कौन से Rx वेरिएबल्स का उपयोग किया जा रहा है और केवल उनके बदलने पर पुनः चित्रित करता है।
class CounterController extends GetxController {
final count = 0.obs;
void increment() => count++;
}
class CounterScreen extends StatelessWidget {
final controller = Get.put(CounterController());
@override
Widget build(context) => Obx(() => Text('${controller.count}'));
}Rx वेरिएबल्स: .obs — एक गेटर जो किसी भी मान को Rx ऑब्जेक्ट में लपेटता है। GetX टाइप किए गए Rx वर्ग प्रदान करता है: RxInt, RxString, RxDouble, RxBool, RxList, RxMap। सभी Rx वेरिएबल्स सामान्य प्रिमिटिव की तरह व्यवहार करते हैं: count++, name.value = 'Hello', items.add(item)। परिवर्तन स्वचालित रूप से Obx सब्सक्राइबर्स को सूचित करता है।
GetBuilder — Rx के बिना Obx का विकल्प, मैन्युअल update() कॉल के माध्यम से काम करता है। GetBuilder.filter — ID कुंजियों द्वारा लक्षित अपडेट के लिए। Obx तेज़ है (स्वचालित निर्भरता ट्रैकिंग), GetBuilder अधिक अनुमानित है (स्पष्ट अपडेट कॉल)। सरल परिदृश्यों के लिए Obx और कई निर्भरताओं वाले जटिल विजेट्स के लिए GetBuilder अनुशंसित है।
GetxController — जीवनचक्र समर्थन के साथ व्यावसायिक तर्क के लिए एक आधार वर्ग। GetxController में विधियाँ हैं: onInit() (आरंभीकरण), onReady() (पहले फ्रेम के बाद), onClose() (संसाधन सफाई)। ChangeNotifier और StateNotifier के विपरीत, GetxController स्वचालित रूप से सब्सक्रिप्शन प्रबंधित करता है: जब पृष्ठ नष्ट हो जाता है, तो सभी Rx वेरिएबल्स और Workers अनसब्सक्राइब हो जाते हैं।
class AuthController extends GetxController {
final user = Rx<User?>(null);
final isLoading = false.obs;
@override
void onInit() {
ever(isLoading, (_) => print('Loading: $isLoading'));
super.onInit();
}
Future<void> login(String email, String password) async {
isLoading.value = true;
user.value = await api.login(email, password);
isLoading.value = false;
}
}Workers — प्रतिक्रियाशील GetX उपयोगिताएँ: ever (प्रत्येक परिवर्तन पर कॉल), once (केवल पहले परिवर्तन पर), debounce (विलंब के साथ), interval (प्रति सेकंड N बार से अधिक नहीं)। Workers सामान्य कार्यों को हल करते हैं: फ़ील्ड सत्यापन (debounce), विश्लेषिकी (once), सिंक्रनाइज़ेशन (ever)। Workers onClose() कॉल करने पर स्वचालित रूप से अनसब्सक्राइब हो जाते हैं, मेमोरी लीक को रोकते हैं।
GetX नेविगेशन को स्क्रीन के बीच संक्रमण के लिए BuildContext की आवश्यकता नहीं होती है। Navigator.push(context, MaterialPageRoute(...)) के बजाय, Get.to(NextScreen()) का उपयोग किया जाता है — कहीं से भी कॉल करने योग्य, जिसमें BuildContext एक्सेस के बिना Controller भी शामिल है। GetX नामित मार्गों, एनिमेशन, मिडलवेयर और MaterialPageRoute के बिना तर्क पास करने का समर्थन करता है।
// सामान्य नेविगेशन
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // वर्तमान मार्ग बदलें
Get.offAll(HomeScreen()); // स्टैक साफ़ करें
// नामित मार्ग
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// मिडलवेयर
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage और GetPages: GetX MaterialApp में routes के बजाय GetPages का उपयोग करता है। Middleware — स्क्रीन में प्रवेश करने से पहले प्रमाणीकरण जाँच, रीडायरेक्ट, विश्लेषिकी। Transition — अंतर्निहित संक्रमण एनिमेशन: fadeIn, zoom, leftToRight, topToBottom। Bindings — एक वर्ग जो मार्ग में प्रवेश करने पर Controller और निर्भरताओं को आरंभ करता है। Bindings आलसी आरंभीकरण समस्या को हल करते हैं: Controller केवल तब बनाया जाता है जब स्क्रीन खोली जाती है।
Get.put — DI कंटेनर में एक इंस्टेंस पंजीकृत करता है। Get.find — कंटेनर से एक इंस्टेंस प्राप्त करता है। Get.lazyPut — आलसी आरंभीकरण (पहली find कॉल पर बनाया गया)। Get.putAsync — अतुल्यकालिक आरंभीकरण (init के साथ सेवाओं के लिए)। Get.delete — कंटेनर से हटाता है (मार्ग नष्ट होने पर Bindings द्वारा स्वचालित रूप से कॉल किया जाता है)।
| विधि | कब बनाई जाती है | कब हटाई जाती है |
|---|---|---|
| Get.put | तुरंत | Get.delete या onClose |
| Get.lazyPut | पहली find पर | Get.delete या onClose |
| Get.putAsync | Future पूरा होने के बाद | Get.delete या onClose |
| Get.create | प्रत्येक find पर (नई फ़ैक्टरी) | नहीं |
GetX DI — Flutter में सबसे सरल DI कंटेनर। कोई Provider ट्री नहीं, कोई Module नहीं, कोई Scope नहीं। Get.put(Repository()) Controller या main.dart में ऑब्जेक्ट को Get.find<Repository>() के माध्यम से एप्लिकेशन में कहीं भी सुलभ बनाता है। GetX DI टैगिंग (tag: 'api') और स्थायित्व (permanent: true) को भी हटाने से रोकने के लिए समर्थन करता है।
GetX प्रदर्शन Rx रैपर पर आधारित है जो GetStream के माध्यम से काम करते हैं — Flutter के लिए अनुकूलित एक कस्टम Stream कार्यान्वयन। GetX बेंचमार्क के अनुसार, Rx वेरिएबल्स बार-बार अपडेट (30+ fps) के साथ ChangeNotifier से 2-3 गुना तेज़ और BLoC से 5-7 गुना तेज़ हैं। GetX सब्सक्रिप्शन के लिए BuildContext का उपयोग नहीं करता है, जो नेविगेशन के दौरान विजेट ट्री के पुनर्निर्माण को समाप्त करता है।
सर्वोत्तम अभ्यास: कई चाइल्ड तत्वों (सूचियाँ, तालिकाएँ) वाले विजेट्स के लिए Obx के बजाय GetBuilder का उपयोग करें। प्रति पृष्ठ एक विशाल Controller के बजाय Controller को कार्यात्मक मॉड्यूल द्वारा विभाजित करें। Controller आरंभीकरण के लिए build विधि में Get.put के बजाय Bindings का उपयोग करें। GetView — Get.find के बिना controller के माध्यम से Controller एक्सेस वाला एक छोटा StatelessWidget।
ज्ञात सीमाएँ: GetX वैश्विक चर (Get.find, Get.to) का उपयोग करता है, जो परीक्षण को जटिल बना सकता है। GetX के माध्यम से निर्भरताओं का मॉक करने के लिए परीक्षणों के बीच Get.replace() या Get.reset() की आवश्यकता होती है। अलगाव के लिए, Get.testMode = true अनुशंसित है। GetX उन अनुप्रयोगों के लिए अनुशंसित नहीं है जिनमें स्पष्ट परत सीमाओं के साथ सख्त आर्किटेक्चर की आवश्यकता होती है — इस मामले में, कोड जनरेशन के साथ BLoC या Riverpod बेहतर है।
अक्सर पूछे जाने वाले प्रश्न
GetX — अपने स्वयं के DI, नेविगेशन और Rx प्रतिक्रियाशीलता के साथ एक माइक्रो-फ्रेमवर्क। Provider — केवल ChangeNotifier और InheritedWidget के माध्यम से राज्य प्रबंधन। GetX को BuildContext की आवश्यकता नहीं है, इसमें अंतर्निहित नेविगेशन और DI है, जो boilerplate को 60-70% कम करता है। Provider मानक Flutter Navigator का उपयोग करता है और DI के लिए तृतीय-पक्ष समाधानों की आवश्यकता होती है। GetX विकास में तेज़ है, Provider मूल Flutter API के करीब है।
Workers — Rx वेरिएबल्स में परिवर्तनों की प्रतिक्रियाशील प्रसंस्करण के लिए उपयोगिताएँ। ever — प्रत्येक परिवर्तन पर कॉलबैक, once — केवल पहले परिवर्तन पर, debounce — विलंब के साथ (खोज क्षेत्रों के लिए), interval — N बार से अधिक नहीं (विश्लेषिकी के लिए)। Workers GetxController के onInit() में घोषित किए जाते हैं और onClose() में स्वचालित रूप से अनसब्सक्राइब हो जाते हैं। यह ChangeNotifier के साथ मैन्युअल addListener/removeListener को बदलता है।
GetX परीक्षण मोड सक्षम करने के लिए Get.testMode = true प्रदान करता है। निर्भरताएँ Get.replace<Service>(mockService) के माध्यम से बदली जाती हैं। परीक्षणों के बीच, DI कंटेनर को साफ़ करने के लिए Get.reset() कॉल किया जाता है। Controller का सीधे Flutter के बिना परीक्षण किया जाता है: final c = CounterController(); c.increment(); expect(c.count.value, 1)। Obx वाले विजेट्स के लिए, InjectMocker के साथ tester.pumpWidget का उपयोग करें।
GetX किसी भी आकार की परियोजनाओं के लिए उपयुक्त है लेकिन अनुशासन की आवश्यकता है। बड़ी परियोजनाओं (10+ स्क्रीन) के लिए, उपयोग करें: Controller अलगाव के लिए Bindings, प्रति सुविधा GetPages फ़ाइलों के रूप में मॉड्यूल, build में मैन्युअल Get.find के बजाय GetView। मुख्य जोखिम वैश्विक पहुँच का दुरुपयोग है (कहीं भी Get.find)। सख्त कोड समीक्षा और आर्किटेक्चरल गाइड इस समस्या को हल करते हैं। लाखों उपयोगकर्ताओं वाले कई प्रोडक्शन एप्लिकेशन GetX पर चलते हैं।
Bindings — एक वर्ग जो मार्ग को उसकी निर्भरताओं से जोड़ता है। स्क्रीन में प्रवेश करने पर, Binding Get.lazyPut के माध्यम से Controller और सेवाएँ बनाता है, और बाहर निकलने पर उन्हें हटा देता है। Bindings आलसी आरंभीकरण लागू करते हैं: Controller स्क्रीन खुलने तक मेमोरी में मौजूद नहीं होता है। यह RAM और ऐप स्टार्टअप समय बचाता है। GetPage में घोषित किए जाते हैं: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें