GetX: کلیدی تصورات، Flutter میں نیویگیشن اور DI

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

GetX — Flutter کے لیے ایک ہلکا پھلکا مائیکرو فریم ورک جو اسٹیٹ مینجمنٹ، نیویگیشن اور ڈیپنڈنسی انجیکشن کو ایک پیکج میں یکجا کرتا ہے۔ امیر حسین عبدالرشیدی کے ذریعہ تیار کردہ، GetX کم سے کم boilerplate پیش کرتا ہے: کوئی Stream نہیں، کوئی ChangeNotifier نہیں، نیویگیشن کے لیے کوئی BuildContext نہیں۔ pub.dev کے مطابق، GetX نے 13 ہزار سے زیادہ لائکس حاصل کیے ہیں، جو Flutter کے مقبول ترین پیکجز میں سے ایک بن گیا ہے۔

اہم نکات

  • Obx — ری ایکٹو ویجیٹ جو Rx متغیر تبدیل ہونے پر دوبارہ تعمیر ہوتا ہے
  • GetController — طریقوں اور Rx متغیرات کے ساتھ کاروباری منطق کی کلاس
  • Get.to — نامزد راستوں کے ذریعے BuildContext کے بغیر نیویگیشن
  • Get.put / Get.find — DI کنٹینر کے ذریعے ڈیپنڈنسی انجیکشن اور حصول
  • Rx متغیرات — خودکار اطلاع کے ساتھ ری ایکٹو ریپر (RxInt, RxString, RxBool)

GetX کیا ہے؟

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 اور Rx

Obx — ایک ری ایکٹو GetX ویجیٹ ہے جو Rx متغیرات تبدیل ہونے پر دوبارہ تعمیر ہوتا ہے۔ Obx کو سبسکرپشن، dispose یا Builder فنکشنز کی ضرورت نہیں ہے — صرف ویجیٹ کو Obx میں لپیٹیں اور اندر Rx متغیر استعمال کریں۔ Obx خودکار طور پر ٹریک کرتا ہے کہ کون سے Rx متغیرات استعمال ہو رہے ہیں اور صرف ان کے تبدیل ہونے پر دوبارہ کھینچتا ہے۔

Dart
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 تجویز کیا جاتا ہے۔

GetController اور لائف سائیکل

GetxController — لائف سائیکل سپورٹ کے ساتھ کاروباری منطق کے لیے ایک بنیادی کلاس ہے۔ GetxController میں طریقے ہیں: onInit() (ابتدائیت)، onReady() (پہلے فریم کے بعد)، onClose() (وسائل کی صفائی)۔ ChangeNotifier اور StateNotifier کے برعکس، GetxController خودکار طور پر سبسکرپشنز کا انتظام کرتا ہے: جب صفحہ تباہ ہو جاتا ہے، تمام Rx متغیرات اور Workers ان سبسکرائب ہو جاتے ہیں۔

Dart
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 کے بغیر آرگیومنٹ پاسنگ کو سپورٹ کرتا ہے۔

Dart
// عام نیویگیشن
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 صرف اس وقت بنایا جاتا ہے جب اسکرین کھولی جاتی ہے۔

GetX کے ساتھ ڈیپنڈنسی انجیکشن

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.putAsyncFuture مکمل ہونے کے بعدGet.delete یا onClose
Get.createہر find پر (نئی فیکٹری)نہیں

GetX DI — Flutter میں سب سے آسان DI کنٹینر۔ کوئی Provider ٹری نہیں، کوئی Module نہیں، کوئی Scope نہیں۔ Controller یا main.dart میں Get.put(Repository()) آبجیکٹ کو Get.find<Repository>() کے ذریعے ایپ میں کہیں بھی قابل رسائی بناتا ہے۔ GetX DI ٹیگنگ (tag: 'api') اور مستقل مزاجی (permanent: true) کو بھی سپورٹ کرتا ہے تاکہ حذف ہونے سے روکا جا سکے۔

GetX: بہترین طریقوں اور کارکردگی

GetX کارکردگی Rx ریپرز پر مبنی ہے جو GetStream — Flutter کے لیے بہتر بنائی گئی ایک کسٹم Stream Implementations کے ذریعے کام کرتے ہیں۔ 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 Provider سے کیسے مختلف ہے؟

GetX — اپنے DI، نیویگیشن اور Rx ری ایکٹیویٹی کے ساتھ ایک مائیکرو فریم ورک۔ Provider — صرف ChangeNotifier اور InheritedWidget کے ذریعے اسٹیٹ مینجمنٹ۔ GetX کو BuildContext کی ضرورت نہیں، بلٹ ان نیویگیشن اور DI ہے، boilerplate کو 60-70% کم کرتا ہے۔ Provider معیاری Flutter Navigator استعمال کرتا ہے اور DI کے لیے تھرڈ پارٹی حل کی ضرورت ہے۔ GetX ترقی میں تیز تر ہے، Provider مقامی Flutter API کے قریب ہے۔

GetX Workers کیا ہیں؟

Workers — Rx متغیرات میں تبدیلیوں کی ری ایکٹو پروسیسنگ کے لیے یوٹیلیٹیز۔ ever — ہر تبدیلی پر کال بیک، once — صرف پہلی تبدیلی پر، debounce — تاخیر کے ساتھ (تلاش کے فیلڈز کے لیے)، interval — N بار سے زیادہ نہیں (تجزیات کے لیے)۔ Workers GetxController کے onInit() میں اعلان کیے جاتے ہیں اور onClose() میں خودکار طور پر ان سبسکرائب ہو جاتے ہیں۔ یہ ChangeNotifier کے ساتھ دستی addListener/removeListener کو تبدیل کرتا ہے۔

GetX کو کیسے ٹیسٹ کریں؟

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 استعمال کرنا چاہیے؟

GetX کسی بھی سائز کے پروجیکٹس کے لیے موزوں ہے لیکن نظم و ضبط کی ضرورت ہے۔ بڑے پروجیکٹس (10+ اسکرینز) کے لیے، استعمال کریں: Controller الگ تھلگ کرنے کے لیے Bindings، فی فیچر GetPages فائلوں کے طور پر ماڈیولز، build میں دستی Get.find کے بجائے GetView۔ اہم خطرہ عالمی رسائی کا غلط استعمال ہے (کہیں بھی Get.find)۔ سخت کوڈ ریویوز اور آرکیٹیکچرل گائیڈز اسے حل کرتے ہیں۔ لاکھوں صارفین والی بہت سی پروڈکشن ایپلیکیشنز GetX پر چلتی ہیں۔

GetX Bindings کیا ہیں؟

Bindings — ایک کلاس جو راستے کو اس کے ڈیپنڈنسیز سے جوڑتی ہے۔ اسکرین میں داخل ہونے پر، Binding Get.lazyPut کے ذریعے Controller اور خدمات بناتا ہے، اور باہر نکلنے پر انہیں ہٹا دیتا ہے۔ Bindings سست ابتدائیت کو لاگو کرتے ہیں: اسکرین کھلنے تک Controller میموری میں موجود نہیں ہوتا۔ یہ RAM اور ایپ اسٹارٹ اپ وقت بچاتا ہے۔ GetPage میں اعلان کیا جاتا ہے: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding())۔

خلاصہ

  • GetX — ایک پیکج میں اسٹیٹ مینجمنٹ، نیویگیشن اور DI کے ساتھ Flutter مائیکرو فریم ورک
  • Obx اور Rx — Stream اور ChangeNotifier کے بغیر خودکار دوبارہ کھینچنے کے ساتھ ری ایکٹو ریپر
  • GetxController — onInit/onReady/onClose لائف سائیکل کے ساتھ کاروباری منطق کی کلاس
  • Get.to / Get.back — بلٹ ان اینیمیشنز کے ساتھ BuildContext کے بغیر نیویگیشن
  • Get.put / Get.find — سست ابتدائیت کے ساتھ Provider ٹری کے بغیر DI کنٹینر
  • Workers — تبدیلیوں کی ری ایکٹو پروسیسنگ کے لیے ever، once، debounce، interval
  • Bindings — آٹو ڈسپوزل کے ساتھ راستہ کھولنے پر سست Controller ابتدائیت

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

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

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

مزید پڑھیں