GetX: əsas anlayışlar, naviqasiya və DI Flutter-də

Müəllif: IT Sectr Dərc olunub: 2026-02-19 Oxuma vaxtı: 7 dəq

GetX — Flutter üçün yüngül mikro-freymvork, vəziyyət idarəetməsi, naviqasiya və asılılıqların enjeksiyonunu bir paketdə birləşdirir. Amir Hossein Abdorashidi tərəfindən hazırlanmış GetX minimal boilerplate təklif edir: Stream, ChangeNotifier, naviqasiya üçün BuildContext olmadan. pub.dev məlumatlarına görə, GetX 13 mindən çox bəyənmə toplayaraq ən populyar Flutter paketlərindən birinə çevrilib.

Əsas məqamlar

  • Obx — Rx-dəyişəni dəyişdikdə yenidən qurulan reaktiv vidjet
  • GetController — metodlar və Rx-dəyişənləri olan biznes-məntiq sinfi
  • Get.to — adlandırılmış marşrutlar vasitəsilə BuildContext-siz naviqasiya
  • Get.put / Get.find — DI-konteyner vasitəsilə asılılıqların enjeksiyonu və alınması
  • Rx-dəyişənləri — avtomatik bildirişlə reaktiv örtüklər (RxInt, RxString, RxBool)

GetX nədir?

GetX — Flutter üçün all-in-one mikro-freymvork, proqramlaşdırmanın üç əsas vəzifəsini həll edir: vəziyyət idarəetməsi (State Management), naviqasiya (Routing) və asılılıqların enjeksiyonu (DI). GetX Stream, ChangeNotifier, Builder və ya abunəlik tələb etmir — bütün reaktivliyi GetValue və GetStream əsasında Rx-örtüklər təmin edir, ChangeNotifier-dən on dəfələrlə sürətli işləyir.

GetX Provider + Navigator + get_it/kiwi dəstinə alternativ olaraq mövqelənir. Üç fərqli paket quraşdırmaq və 10 sətir konfiqurasiya yazmaq əvəzinə, GetX hər şeyi bir sətirlə təqdim edir: GetMaterialApp əvəzinə MaterialApp. Naviqasiya Get.to(NextScreen()) ilə BuildContext-siz, DI isə Get.put(Service()) ilə Provider ağacı olmadan işləyir.

Flutter Community Survey 2025 məlumatlarına görə, GetX Flutter layihələrinin 43%-də istifadə olunur. Seçimin əsas səbəbləri: minimal giriş həddi (5 dəqiqədə mənimsəmə), boilerplate-in olmaması (kod Provider və ya BLoC ilə müqayisədə 60-70% qısalır) və sürətli MVP inkişafı. Tənqidçilər məsuliyyətlərin ayrılması prinsipinin pozulmasını və debug çətinliyini qeyd edirlər.

Reaktiv vəziyyət: Obx və Rx

Obx — Rx-dəyişənləri dəyişdikdə yenidən qurulan GetX reaktiv vidjeti. Obx abunəlik, dispose və ya Builder funksiyaları tələb etmir — vidjeti Obx-ə bükmək və içəridə Rx-dəyişəni istifadə etmək kifayətdir. Obx avtomatik olaraq hansı Rx-dəyişənlərinin istifadə edildiyini izləyir və yalnız onlar dəyişdikdə yenidən çəkir.

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-dəyişənləri: .obs — istənilən dəyəri Rx-obyektinə bükən getter. GetX tipləşdirilmiş Rx-sinifləri təqdim edir: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Bütün Rx-dəyişənləri adi primitivlər kimi davranır: count++, name.value = 'Hello', items.add(item). Dəyişiklik avtomatik olaraq Obx abunəçilərinə xəbər verir.

GetBuilder — Rx-siz Obx alternativi, əl ilə update() çağırışı ilə işləyir. GetBuilder.filter — ID-açarları üzrə nöqtəli yeniləmə üçün. Obx daha sürətlidir (avtomatik asılılıq izləmə), GetBuilder daha proqnozlaşdırıla biləndir (açıq yeniləmə çağırışı). Sadə ssenarilər üçün Obx, çoxlu asılılıqları olan mürəkkəb vidjetlər üçün GetBuilder tövsiyə olunur.

GetController və həyat dövrü

GetxController — həyat dövrü dəstəyi ilə biznes-məntiq üçün əsas sinif. GetxController metodlara malikdir: onInit() (ilkinləşdirmə), onReady() (ilk freymdan sonra), onClose() (resursların təmizlənməsi). ChangeNotifier və StateNotifier-dən fərqli olaraq, GetxController abunəlikləri avtomatik idarə edir: səhifə məhv edildikdə bütün Rx-dəyişənləri və Workers abunəlikdən çıxarılır.

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-in reaktiv vasitələri: ever (hər dəyişiklikdə çağırılır), once (yalnız ilk dəyişiklikdə), debounce (gecikmə ilə), interval (saniyədə N dəfədən çox olmayaraq). Workers tipik tapşırıqları həll edir: sahə validasiyası (debounce), analitika (once), sinxronizasiya (ever). Workers onClose() çağırıldıqda avtomatik abunəlikdən çıxarılır, sızmaların qarşısını alır.

GetX naviqasiyası ekranlar arasında keçid üçün BuildContext tələb etmir. Navigator.push(context, MaterialPageRoute(...)) əvəzinə Get.to(NextScreen()) istifadə olunur — BuildContext-ə çıxışı olmayan Controller daxil olmaqla istənilən yerdən çağırış. GetX adlandırılmış marşrutları, animasiyaları, middleware və MaterialPageRoute-siz arqument ötürülməsini dəstəkləyir.

Dart
// Adi naviqasiya
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // cari marşrutu əvəz et
Get.offAll(HomeScreen()); // stack-i təmizlə

// Adlandırılmış marşrutlar
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

// Middleware
GetPage(
  name: '/profile',
  page: () => ProfileScreen(),
  middlewares: [AuthMiddleware()],
)

GetPage və GetPages: GetX MaterialApp-də routes əvəzinə GetPages istifadə edir. Middleware — ekrana girməzdən əvvəl autorizasiya yoxlaması, yönləndirmələr, analitika. Transition — daxili keçid animasiyaları: fadeIn, zoom, leftToRight, topToBottom. Bindings — marşruta daxil olarkən Controller və asılılıqları ilkinləşdirən sinif. Bindings ləng ilkinləşdirmə problemini həll edir: Controller yalnız ekran açıq olduqda yaradılır.

GetX ilə Dependency Injection

Get.put — nümunənin DI-konteynerdə qeydiyyatı. Get.find — konteynerdən nümunənin alınması. Get.lazyPut — ləng ilkinləşdirmə (ilk find çağırışında yaradılır). Get.putAsync — asinxron ilkinləşdirmə (init olan xidmətlər üçün). Get.delete — konteynerdən silmə (marşrut məhv edildikdə Bindings tərəfindən avtomatik çağırılır).

MetodNə vaxt yaradılırNə vaxt silinir
Get.putDərhalGet.delete və ya onClose
Get.lazyPutİlk find-daGet.delete və ya onClose
Get.putAsyncFuture yerinə yetirildikdən sonraGet.delete və ya onClose
Get.createHər find-da (yeni fabrik)Yox

GetX DI — Flutter-də ən sadə DI-konteyner. Provider ağacı, Module, Scope yoxdur. Controller və ya main.dart-da Get.put(Repository()) obyekti Get.find<Repository>() vasitəsilə tətbiqin istənilən yerində əlçatan edir. GetX DI həmçinin teqləmə (tag: 'api') və davamlılıq (permanent: true) silinmənin qarşısını almaq üçün dəstəkləyir.

GetX: best practices və performans

GetX performansı Flutter üçün optimallaşdırılmış öz Stream implementasiyası olan GetStream vasitəsilə işləyən Rx-örtüklərə əsaslanır. GetX benchmarklarına görə, Rx-dəyişənləri tez-tez yeniləmələrdə (30+ fps) ChangeNotifier-dən 2-3 dəfə, BLoC-dan 5-7 dəfə sürətlidir. GetX abunəliklər üçün BuildContext istifadə etmir, bu da naviqasiya zamanı vidjet ağacının yenidən qurulmasını aradan qaldırır.

Best practices: çoxlu uşaq elementləri olan vidjetlər üçün (siyahılar, cədvəllər) Obx əvəzinə GetBuilder istifadə edin. Controller-ləri bir nəhəng Controller əvəzinə funksional modullara bölün. Controller-in ilkinləşdirilməsi üçün build metodunda Get.put yox, Bindings istifadə edin. GetView — Get.find olmadan controller vasitəsilə Controller-ə girişi olan qısaldılmış StatelessWidget.

Məlum məhdudiyyətlər: GetX qlobal dəyişənlərdən (Get.find, Get.to) istifadə edir, bu da testi çətinləşdirə bilər. GetX vasitəsilə asılılıqların mock edilməsi testlər arasında Get.replace() və ya Get.reset() tələb edir. İzolyasiya üçün Get.testMode = true tövsiyə olunur. GetX aydın təbəqə sərhədləri olan ciddi arxitektura tələb edən tətbiqlər üçün tövsiyə edilmir — bu halda BLoC və ya kodgenerasiya ilə Riverpod daha üstündür.

Tez-tez verilən suallar

GetX Provider-dən nə ilə fərqlənir?

GetX — öz DI, naviqasiya və Rx-reaktivliyi olan mikro-freymvork. Provider — yalnız ChangeNotifier və InheritedWidget vasitəsilə vəziyyət idarəetməsi. GetX BuildContext tələb etmir, daxili naviqasiya və DI-ya malikdir, boilerplate-i 60-70% azaldır. Provider standart Flutter Navigator-dan istifadə edir və DI üçün üçüncü tərəf həlləri tələb edir. GetX inkişafda daha sürətlidir, Provider — doğma Flutter API-yə daha yaxındır.

GetX Workers nədir?

Workers — Rx-dəyişənlərinin dəyişikliklərinin reaktiv emalı üçün vasitələr. ever — hər dəyişiklikdə callback, once — yalnız birincidə, debounce — gecikmə ilə (axtarış sahəsi üçün), interval — N dəfədən çox olmayaraq (analitika üçün). Workers onInit() GetxController-də elan edilir və onClose()-da avtomatik abunəlikdən çıxarılır. Bu, ChangeNotifier ilə əl ilə addListener/removeListener-i əvəz edir.

GetX-i necə test etməli?

GetX test rejimini işə salmaq üçün Get.testMode = true təqdim edir. Asılılıqlar Get.replace<Service>(mockService) vasitəsilə əvəz olunur. Testlər arasında DI-konteyneri təmizləmək üçün Get.reset() çağırılır. Controller-lər Flutter-siz birbaşa test edilir: final c = CounterController(); c.increment(); expect(c.count.value, 1). Obx olan vidjetlər üçün InjectMocker ilə tester.pumpWidget istifadə edin.

Böyük layihələr üçün GetX istifadə etməyə dəyər?

GetX istənilən ölçülü layihələr üçün uyğundur, lakin intizam tələb edir. Böyük layihələr üçün (10+ ekran) istifadə edin: Controller-lərin izolyasiyası üçün Bindings, modullar (funksionallıq üzrə GetPages faylları), build-də əl ilə Get.find əvəzinə GetView. Əsas risk — qlobal girişdən sui-istifadə (istənilən yerdə Get.find). Ciddi code review və arxitektura təlimatları bu problemi həll edir. Milyonlarla istifadəçisi olan bir çox istehsal tətbiqləri GetX üzərində işləyir.

GetX Bindings nədir?

Bindings — marşrutu onun asılılıqları ilə birləşdirən sinif. Ekrana daxil olarkən Binding Controller və xidmətləri Get.lazyPut vasitəsilə yaradır, çıxarkən silir. Bindings ləng ilkinləşdirməni həyata keçirir: Controller ekran açılmayana qədər yaddaşda mövcud deyil. Bu, RAM və tətbiqin işə düşmə vaxtına qənaət edir. GetPage-də elan edilir: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Nəticə

  • GetX — vəziyyət idarəetməsi, naviqasiya və DI olan Flutter mikro-freymvorku
  • Obx və Rx — Stream və ChangeNotifier-siz avtomatik yenidən çəkmə ilə reaktiv örtüklər
  • GetxController — onInit/onReady/onClose həyat dövrü ilə biznes-məntiq sinfi
  • Get.to / Get.back — daxili animasiyalarla BuildContext-siz naviqasiya
  • Get.put / Get.find — ləng ilkinləşdirmə ilə Provider ağacısız DI-konteyner
  • Workers — dəyişikliklərin reaktiv emalı üçün ever, once, debounce, interval
  • Bindings — avtomatik dispos ilə marşrut açıldıqda Controller-in ləng ilkinləşdirilməsi

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun