GetX — Flutter uchun yengil mikro-freymvork, holat boshqaruvi, navigatsiya va bog'liqliklarni inyeksiya qilishni bir paketda birlashtiradi. Amir Hossein Abdorashidi tomonidan yaratilgan GetX minimal boilerplate taklif qiladi: Stream, ChangeNotifier, navigatsiya uchun BuildContextsiz. pub.dev ma'lumotlariga ko'ra, GetX 13 mingdan ortiq layk to'plab, eng mashhur Flutter paketlaridan biriga aylandi.
Asosiy fikrlar
GetX — Flutter uchun all-in-one mikro-freymvork, dasturlashning uchta asosiy vazifasini hal qiladi: holat boshqaruvi (State Management), navigatsiya (Routing) va bog'liqliklarni inyeksiya qilish (DI). GetX Stream, ChangeNotifier, Builder yoki obunalarni talab qilmaydi — barcha reaktivlik GetValue va GetStream asosidagi Rx-o'ramlar tomonidan ta'minlanadi, ChangeNotifier-dan o'nlab marta tez ishlaydi.
GetX Provider + Navigator + get_it/kiwi to'plamiga muqobil sifatida pozitsiyalanadi. Uch xil paketni o'rnatish va 10 qator konfiguratsiya yozish o'rniga, GetX hamma narsani bir qator bilan taqdim etadi: GetMaterialApp o'rniga MaterialApp. Navigatsiya Get.to(NextScreen()) bilan BuildContextsiz, DI esa Get.put(Service()) bilan Provider daraxtisiz ishlaydi.
Flutter Community Survey 2025 ma'lumotlariga ko'ra, GetX Flutter loyihalarining 43 foizida qo'llaniladi. Tanlashning asosiy sabablari: minimal kirish chegarasi (5 daqiqada o'zlashtirish), boilerplate yo'qligi (kod Provider yoki BLoC bilan solishtirganda 60-70 foiz qisqaradi) va tez MVP ishlab chiqish. Tanqidchilar mas'uliyatlarni ajratish printsipining buzilishi va disk raskadrovka qilish qiyinligini ta'kidlaydilar.
Obx — Rx-o'zgaruvchilari o'zgarganda qayta quriladigan GetX reaktiv vidjeti. Obx obuna, dispose yoki Builder funksiyalarini talab qilmaydi — vidjetni Obx ga o'rash va ichida Rx-o'zgaruvchidan foydalanish kifoya. Obx qaysi Rx-o'zgaruvchilar ishlatilayotganini avtomatik kuzatadi va faqat ular o'zgarganda qayta chizadi.
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-o'zgaruvchilari: .obs — har qanday qiymatni Rx-obyektiga o'raydigan getter. GetX tiplangan Rx-sinflarini taqdim etadi: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Barcha Rx-o'zgaruvchilari oddiy primitivlar kabi harakat qiladi: count++, name.value = 'Hello', items.add(item). O'zgarish avtomatik ravishda Obx obunachilariga xabar beradi.
GetBuilder — Rx-siz Obx muqobili, qo'lda update() chaqiruvi bilan ishlaydi. GetBuilder.filter — ID-kalitlari bo'yicha nuqtali yangilash uchun. Obx tezroq (avtomatik bog'liqlik kuzatuvi), GetBuilder oldindan bashorat qilinadigan (aniq yangilash chaqiruvi). Oddiy stsenariylar uchun Obx, ko'p bog'liqliklarga ega murakkab vidjetlar uchun GetBuilder tavsiya etiladi.
GetxController — hayot sikli qo'llab-quvvatlashi bilan biznes-mantiq uchun asosiy sinf. GetxController metodlarga ega: onInit() (initsializatsiya), onReady() (birinchi freymdan keyin), onClose() (resurslarni tozalash). ChangeNotifier va StateNotifier-dan farqli o'laroq, GetxController obunalarni avtomatik boshqaradi: sahifa yo'q qilinganda barcha Rx-o'zgaruvchilari va Workers obunadan chiqariladi.
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 reaktiv vositalari: ever (har o'zgarishda chaqiriladi), once (faqat birinchi o'zgarishda), debounce (kechikish bilan), interval (sekundiga N martadan ko'p emas). Workers odatiy vazifalarni hal qiladi: maydon validatsiyasi (debounce), analitika (once), sinxronlash (ever). Workers onClose() chaqirilganda avtomatik obunadan chiqariladi, xotira oqishining oldini oladi.
GetX navigatsiyasi ekranlar o'rtasida o'tish uchun BuildContext talab qilmaydi. Navigator.push(context, MaterialPageRoute(...)) o'rniga Get.to(NextScreen()) ishlatiladi — BuildContext-ga kirish imkoniga ega bo'lmagan Controller ham istalgan joydan chaqiruv. GetX nomlangan marshrutlar, animatsiyalar, middleware va MaterialPageRoute-siz argument uzatishni qo'llab-quvvatlaydi.
// Oddiy navigatsiya
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // joriy marshrutni almashtir
Get.offAll(HomeScreen()); // stack ni tozalash
// Nomlangan marshrutlar
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// Middleware
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage va GetPages: GetX MaterialApp da routes o'rniga GetPages ishlatadi. Middleware — ekranga kirishdan oldin avtorizatsiya tekshiruvi, yo'naltirishlar, analitika. Transition — o'rnatilgan o'tish animatsiyalari: fadeIn, zoom, leftToRight, topToBottom. Bindings — marshrutga kirishda Controller va bog'liqliklarni initsializatsiya qiluvchi sinf. Bindings dangasa initsializatsiya muammosini hal qiladi: Controller faqat ekran ochiq bo'lganda yaratiladi.
Get.put — namunaning DI-konteynerda ro'yxatdan o'tkazilishi. Get.find — konteynerdan namunani olish. Get.lazyPut — dangasa initsializatsiya (birinchi find chaqiruvida yaratiladi). Get.putAsync — asinxron initsializatsiya (initga ega xizmatlar uchun). Get.delete — konteynerdan o'chirish (marshrut yo'q qilinganda Bindings tomonidan avtomatik chaqiriladi).
| Metod | Qachon yaratiladi | Qachon o'chiriladi |
|---|---|---|
| Get.put | Darhol | Get.delete yoki onClose |
| Get.lazyPut | Birinchi find da | Get.delete yoki onClose |
| Get.putAsync | Future bajarilgandan keyin | Get.delete yoki onClose |
| Get.create | Har bir find da (yangi fabrika) | Yo'q |
GetX DI — Flutter-dagi eng sodda DI-konteyner. Provider daraxti, Module, Scope yo'q. Controller yoki main.dart da Get.put(Repository()) obyektni Get.find<Repository>() orqali ilovaning istalgan joyida mavjud qiladi. GetX DI shuningdek teglash (tag: 'api') va doimiylik (permanent: true) o'chirilishni oldini olish uchun qo'llab-quvvatlaydi.
GetX unumdorligi Flutter uchun optimallashtirilgan o'z Stream implementatsiyasi GetStream orqali ishlaydigan Rx-o'ramlarga asoslanadi. GetX benchmarklariga ko'ra, Rx-o'zgaruvchilari tez-tez yangilashlarda (30+ fps) ChangeNotifier-dan 2-3 marta, BLoC-dan 5-7 marta tezroq. GetX obunalar uchun BuildContext ishlatmaydi, bu navigatsiya paytida vidjet daraxtining qayta qurilishini bartaraf qiladi.
Best practices: ko'p bolali elementlarga ega vidjetlar uchun (ro'yxatlar, jadvallar) Obx o'rniga GetBuilder dan foydalaning. Controllerlarni funksional modullar bo'yicha ajrating, bitta sahifa uchun bitta ulkan Controller emas. Controller initsializatsiyasi uchun build metodida Get.put emas, Bindings dan foydalaning. GetView — Get.find holda controller orqali Controller-ga kirishga ega qisqartirilgan StatelessWidget.
Ma'lum cheklovlar: GetX global o'zgaruvchilardan (Get.find, Get.to) foydalanadi, bu testlashni qiyinlashtirishi mumkin. GetX orqali bog'liqliklarni moklash testlar o'rtasida Get.replace() yoki Get.reset() talab qiladi. Izolyatsiya uchun Get.testMode = true tavsiya etiladi. GetX aniq qatlam chegaralari bilan qattiq arxitektura talab qiladigan ilovalar uchun tavsiya etilmaydi — bu holda BLoC yoki kod generatsiyasi bilan Riverpod afzal.
Tez-tez beriladigan savollar
GetX — o'z DI, navigatsiya va Rx-reaktivligi bilan mikro-freymvork. Provider — faqat ChangeNotifier va InheritedWidget orqali holat boshqaruvi. GetX BuildContext talab qilmaydi, o'rnatilgan navigatsiya va DI ga ega, boilerplate ni 60-70 foizga kamaytiradi. Provider standart Flutter Navigator dan foydalanadi va DI uchun uchinchi tomon yechimlarini talab qiladi. GetX rivojlanishda tezroq, Provider — mahalliy Flutter API ga yaqinroq.
Workers — Rx-o'zgaruvchilari o'zgarishlarini reaktiv qayta ishlash uchun vositalar. ever — har o'zgarishda callback, once — faqat birinchida, debounce — kechikish bilan (qidiruv maydoni uchun), interval — N martadan ko'p emas (analitika uchun). Workers onInit() GetxController da e'lon qilinadi va onClose() da avtomatik obunadan chiqariladi. Bu ChangeNotifier bilan qo'lda addListener/removeListener ni almashtiradi.
GetX test rejimini yoqish uchun Get.testMode = true ni taqdim etadi. Bog'liqliklar Get.replace<Service>(mockService) orqali almashtiriladi. Testlar o'rtasida DI-konteynerni tozalash uchun Get.reset() chaqiriladi. Controllerlar Fluttersiz to'g'ridan-to'g'ri test qilinadi: final c = CounterController(); c.increment(); expect(c.count.value, 1). Obx li vidjetlar uchun InjectMocker bilan tester.pumpWidget dan foydalaning.
GetX har qanday o'lchamdagi loyihalar uchun mos, lekin intizom talab qiladi. Katta loyihalar uchun (10+ ekran) foydalaning: Controllerlarni izolyatsiya qilish uchun Bindings, modullar (funksionallik bo'yicha GetPages fayllari), build da qo'lda Get.Find o'rniga GetView. Asosiy xavf — global kirishni suiiste'mol qilish (istalgan joyda Get.find). Qattiq code review va arxitektura yo'riqnomalari bu muammoni hal qiladi. Millionlab foydalanuvchilarga ega ko'plab ishlab chiqarish ilovalari GetX da ishlaydi.
Bindings — marshrutni uning bog'liqliklari bilan bog'laydigan sinf. Ekranga kirishda Binding Controller va xizmatlarni Get.lazyPut orqali yaratadi, chiqishda ularni o'chiradi. Bindings dangasa initsializatsiyani amalga oshiradi: Controller ekran ochilmaguncha xotirada mavjud emas. Bu RAM va ilovaning ishga tushish vaqtini tejaydi. GetPage da e'lon qilinadi: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
Xulosa
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.