GetX: mga pangunahing konsepto, nabigasyon at DI sa Flutter

May-akda: IT Sectr Nai-publish: 2026-02-19 Oras ng pagbabasa: 7 min

GetX — isang magaan na micro-framework para sa Flutter na pinagsasama ang pamamahala ng estado, nabigasyon at dependency injection sa isang pakete. Binuo ni Amir Hossein Abdorashidi, nag-aalok ang GetX ng minimal na boilerplate: walang Stream, walang ChangeNotifier, walang BuildContext para sa nabigasyon. Ayon sa datos ng pub.dev, ang GetX ay nakaipon ng higit sa 13 libong likes, naging isa sa mga pinakasikat na Flutter package.

Mga Pangunahing Punto

  • Obx — reaktibong widget na nag-rebuild kapag nagbago ang Rx-variable
  • GetController — klase ng lohika ng negosyo na may mga pamamaraan at Rx-variable
  • Get.to — nabigasyon nang walang BuildContext sa pamamagitan ng mga pinangalanang ruta
  • Get.put / Get.find — iniksyon at pagkuha ng mga dependency sa pamamagitan ng DI-container
  • Mga Rx-variable — reaktibong pambalot (RxInt, RxString, RxBool) na may awtomatikong abiso

Ano ang GetX?

GetX — isang all-in-one micro-framework para sa Flutter na lumulutas sa tatlong pangunahing gawain ng pag-develop: pamamahala ng estado (State Management), nabigasyon (Routing), at dependency injection (DI). Hindi nangangailangan ang GetX ng Stream, ChangeNotifier, Builder o mga subscription — lahat ng reaktibidad ay ibinibigay ng Rx-pambalot batay sa GetValue at GetStream, na gumagana nang sampu-sampung beses na mas mabilis kaysa ChangeNotifier.

Ang GetX ay nakaposisyon bilang alternatibo sa kombinasyon ng Provider + Navigator + get_it/kiwi. Sa halip na mag-install ng tatlong magkakaibang package at magsulat ng 10 linya ng configuration, ang GetX ay nagbibigay ng lahat sa isang kahon na may isang linya: GetMaterialApp sa halip na MaterialApp. Gumagana ang nabigasyon sa pamamagitan ng Get.to(NextScreen()) nang walang BuildContext, at DI — sa pamamagitan ng Get.put(Service()) nang walang Provider tree.

Ayon sa Flutter Community Survey 2025, ang GetX ay ginagamit sa 43% ng mga proyektong Flutter. Mga pangunahing dahilan ng pagpili: minimal na threshold ng pagpasok (5 minuto para matutunan), kawalan ng boilerplate (umiikli ang code ng 60-70% kumpara sa Provider o BLoC) at mabilis na pag-develop ng MVP. Itinuturo ng mga kritiko ang paglabag sa prinsipyo ng paghihiwalay ng responsibilidad at kahirapan sa debugging.

Reaktibong estado: Obx at Rx

Obx — ang reaktibong widget ng GetX na nag-rebuild kapag nagbago ang mga Rx-variable. Hindi nangangailangan ang Obx ng subscription, dispose o mga function ng Builder — sapat na upang balutin ang widget sa Obx at gumamit ng Rx-variable sa loob. Awtomatikong sinusubaybayan ng Obx kung aling mga Rx-variable ang ginagamit at nagre-redraw lamang kapag nagbago ang mga ito.

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}'));
}

Mga Rx-variable: .obs — getter na bumabalot sa anumang halaga sa isang Rx-object. Nagbibigay ang GetX ng mga naka-type na Rx-klase: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Lahat ng Rx-variable ay kumikilos tulad ng mga ordinaryong primitibo: count++, name.value = 'Hello', items.add(item). Ang pagbabago ay awtomatikong nag-aabiso sa mga subscriber ng Obx.

GetBuilder — alternatibo sa Obx nang walang Rx, gumagana sa pamamagitan ng manu-manong pagtawag ng update(). GetBuilder.filter — para sa tumpak na pag-update ayon sa mga ID-key. Mas mabilis ang Obx (awtomatikong pagsubaybay ng dependency), mas predictable ang GetBuilder (malinaw na pagtawag ng pag-update). Inirerekomenda ang Obx para sa mga simpleng senaryo at GetBuilder para sa mga kumplikadong widget na may maraming dependency.

GetController at siklo ng buhay

GetxController — base na klase para sa lohika ng negosyo na may suporta sa siklo ng buhay. Ang GetxController ay may mga pamamaraan: onInit() (inisyalisasyon), onReady() (pagkatapos ng unang frame), onClose() (paglilinis ng mga mapagkukunan). Hindi tulad ng ChangeNotifier at StateNotifier, awtomatikong namamahala ang GetxController ng mga subscription: kapag nawasak ang pahina, lahat ng Rx-variable at Workers ay nag-a-unsubscribe.

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 — mga reaktibong utility ng GetX: ever (tinatawag sa bawat pagbabago), once (sa unang pagbabago lamang), debounce (may pagkaantala), interval (hindi hihigit sa N beses bawat segundo). Nilulutas ng Workers ang mga karaniwang gawain: validation ng field (debounce), analytics (once), synchronization (ever). Awtomatikong nag-a-unsubscribe ang Workers kapag tinawag ang onClose(), na pumipigil sa mga tagas ng memorya.

Nabigasyon ng GetX ay hindi nangangailangan ng BuildContext para sa paglipat sa pagitan ng mga screen. Sa halip na Navigator.push(context, MaterialPageRoute(...)) ay ginagamit ang Get.to(NextScreen()) — pagtawag mula sa kahit saan, kabilang ang Controller na walang access sa BuildContext. Sinusuportahan ng GetX ang mga pinangalanang ruta, animation, middleware at pagpapadala ng argumento nang walang MaterialPageRoute.

Dart
// Karaniwang nabigasyon
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // palitan ang kasalukuyang ruta
Get.offAll(HomeScreen()); // linisin ang stack

// Mga pinangalanang ruta
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

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

GetPage at GetPages: Ginagamit ng GetX ang GetPages sa halip na routes sa MaterialApp. Middleware — pagsusuri ng awtorisasyon, mga redirect, analytics bago pumasok sa screen. Transition — mga built-in na animation ng paglipat: fadeIn, zoom, leftToRight, topToBottom. Bindings — klase na nag-i-initialize ng Controller at mga dependency kapag pumapasok sa ruta. Nilulutas ng Bindings ang problema ng lazy initialization: ang Controller ay nilikha lamang kapag bukas ang screen.

Dependency Injection gamit ang GetX

Get.put — pagrerehistro ng instance sa DI-container. Get.find — pagkuha ng instance mula sa container. Get.lazyPut — lazy initialization (nilikha sa unang pagtawag ng find). Get.putAsync — asynchronous na inisyalisasyon (para sa mga serbisyo na may init). Get.delete — pagtanggal mula sa container (awtomatikong tinatawag ng Bindings kapag nawasak ang ruta).

ParaanKailan nilikhaKailang tinanggal
Get.putKaagadGet.delete o onClose
Get.lazyPutSa unang findGet.delete o onClose
Get.putAsyncPagkatapos ma-execute ang FutureGet.delete o onClose
Get.createSa bawat find (bagong pabrika)Hindi

GetX DI — ang pinakasimpleng DI-container sa Flutter. Walang Provider tree, walang Module, walang Scope. Ang Get.put(Repository()) sa Controller o main.dart ay ginagawang available ang object kahit saan sa application sa pamamagitan ng Get.find<Repository>(). Sinusuportahan din ng GetX DI ang pag-tag (tag: 'api') at permanensya (permanent: true) upang maiwasan ang pagtanggal.

GetX: best practices at pagganap

Pagganap ng GetX ay batay sa mga Rx-pambalot na gumagana sa pamamagitan ng GetStream — sariling implementasyon ng Stream na na-optimize para sa Flutter. Ayon sa GetX benchmarks, ang Rx-variable ay 2-3 beses na mas mabilis kaysa ChangeNotifier at 5-7 beses na mas mabilis kaysa BLoC sa mga madalas na pag-update (30+ fps). Hindi ginagamit ng GetX ang BuildContext para sa mga subscription, na nag-aalis ng pag-rebuild ng widget tree sa panahon ng nabigasyon.

Best practices: gamitin ang GetBuilder sa halip na Obx para sa mga widget na may maraming elemento ng anak (mga listahan, talahanayan). Hatiin ang mga Controller ayon sa functional na mga module, hindi isang malaking Controller bawat pahina. Gamitin ang Bindings para sa inisyalisasyon ng Controller, hindi Get.put sa build method. GetView — isang pinaikling StatelessWidget na may access sa Controller sa pamamagitan ng controller nang walang Get.find.

Mga kilalang limitasyon: Gumagamit ang GetX ng mga global variable (Get.find, Get.to), na maaaring magpahirap sa pag-test. Ang pag-mock ng mga dependency sa pamamagitan ng GetX ay nangangailangan ng Get.replace() o Get.reset() sa pagitan ng mga test. Para sa paghihiwalay, inirerekomenda ang Get.testMode = true. Hindi inirerekomenda ang GetX para sa mga application na nangangailangan ng mahigpit na arkitektura na may malinaw na mga hangganan ng layer — sa kasong ito, mas gusto ang BLoC o Riverpod na may code generation.

Mga Madalas Itanong

Ano ang pagkakaiba ng GetX sa Provider?

GetX — micro-framework na may sariling DI, nabigasyon at Rx-reaktibidad. Provider — pamamahala lamang ng estado sa pamamagitan ng ChangeNotifier at InheritedWidget. Hindi nangangailangan ang GetX ng BuildContext, may built-in na nabigasyon at DI, binabawasan ang boilerplate ng 60-70%. Gumagamit ang Provider ng standard na Flutter Navigator at nangangailangan ng mga third-party na solusyon para sa DI. Mas mabilis ang GetX sa pag-develop, ang Provider — mas malapit sa native Flutter API.

Ano ang GetX Workers?

Workers — mga utility para sa reaktibong pagproseso ng mga pagbabago sa Rx-variable. ever — callback sa bawat pagbabago, once — sa unang pagbabago lamang, debounce — may pagkaantala (para sa field ng paghahanap), interval — hindi hihigit sa N beses (para sa analytics). Ang Workers ay idineklara sa onInit() ng GetxController at awtomatikong nag-a-unsubscribe sa onClose(). Pinapalitan nito ang manu-manong addListener/removeListener sa ChangeNotifier.

Paano i-test ang GetX?

Nagbibigay ang GetX ng Get.testMode = true para i-activate ang test mode. Ang mga dependency ay pinapalitan sa pamamagitan ng Get.replace<Service>(mockService). Sa pagitan ng mga test, tinatawag ang Get.reset() para linisin ang DI-container. Ang mga Controller ay direktang nai-test nang walang Flutter: final c = CounterController(); c.increment(); expect(c.count.value, 1). Para sa mga widget na may Obx, gamitin ang tester.pumpWidget na may InjectMocker.

Mahalaga bang gamitin ang GetX para sa malalaking proyekto?

Ang GetX ay angkop para sa mga proyekto ng anumang laki, ngunit nangangailangan ng disiplina. Para sa malalaking proyekto (10+ screen) gamitin: Bindings para sa paghihiwalay ng Controller, mga module (mga file ng GetPages bawat functionality), GetView sa halip na manu-manong Get.find sa build. Ang pangunahing panganib — labis na paggamit ng global access (Get.find kahit saan). Ang mahigpit na code review at mga gabay sa arkitektura ay lumulutas sa problemang ito. Maraming production application na may milyun-milyong user ang tumatakbo sa GetX.

Ano ang GetX Bindings?

Bindings — klase na nag-uugnay ng ruta sa mga dependency nito. Sa pagpasok sa screen, ang Binding ay lumilikha ng Controller at mga serbisyo sa pamamagitan ng Get.lazyPut, sa paglabas — tinatanggal ang mga ito. Ipinapatupad ng Bindings ang lazy initialization: ang Controller ay hindi umiiral sa memory hanggang sa mabuksan ang screen. Ito ay nakakatipid ng RAM at oras ng pagsisimula ng application. Idineklara sa GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Buod

  • GetX — Flutter micro-framework na may pamamahala ng estado, nabigasyon at DI sa isang pakete
  • Obx at Rx — reaktibong pambalot na may awtomatikong pag-re-redraw nang walang Stream at ChangeNotifier
  • GetxController — klase ng lohika ng negosyo na may siklo ng buhay na onInit/onReady/onClose
  • Get.to / Get.back — nabigasyon nang walang BuildContext na may built-in na animation
  • Get.put / Get.find — DI-container nang walang Provider tree na may lazy initialization
  • Workers — ever, once, debounce, interval para sa reaktibong pagproseso ng mga pagbabago
  • Bindings — lazy initialization ng Controller sa pagbukas ng ruta na may auto-disposal

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din