GetX — egy könnyűsúlyú mikro-keretrendszer Flutter-hez, amely egyesíti az állapotkezelést, navigációt és függőséginjektálást egy csomagban. Amir Hossein Abdorashidi által fejlesztett GetX minimális boilerplate-et kínál: Stream nélkül, ChangeNotifier nélkül, BuildContext nélkül a navigációhoz. A pub.dev adatai szerint a GetX több mint 13 ezer like-ot gyűjtött, így az egyik legnépszerűbb Flutter csomaggá vált.
Főbb pontok
GetX — egy all-in-one mikro-keretrendszer Flutter-hez, amely három fő fejlesztési feladatot old meg: állapotkezelés (State Management), navigáció (Routing) és függőséginjektálás (DI). A GetX nem igényel Stream-et, ChangeNotifier-t, Builder-eket vagy feliratkozásokat — a teljes reaktivitást az Rx-burkolók biztosítják GetValue és GetStream alapokon, amelyek tízszer gyorsabban működnek, mint a ChangeNotifier.
A GetX a Provider + Navigator + get_it/kiwi kombináció alternatívájaként pozicionálja magát. Ahelyett, hogy három különböző csomagot telepítene és 10 sor konfigurációt írna, a GetX mindent egy dobozban ad egy sorral: GetMaterialApp a MaterialApp helyett. A navigáció a Get.to(NextScreen()) segítségével működik BuildContext nélkül, a DI pedig a Get.put(Service()) segítségével Provider-fa nélkül.
A Flutter Community Survey 2025 szerint a GetX a Flutter projektek 43%-ában használatos. A választás fő okai: minimális belépési küszöb (5 perc megtanulni), nincs boilerplate (a kód 60-70%-kal rövidebb a Provider vagy BLoC összehasonlításában) és gyors MVP fejlesztés. A kritikusok a felelősségi körök szétválasztásának elvének megsértését és a hibakeresés nehézségét említik.
Obx — a GetX reaktív widgetje, amely az Rx-változók megváltozásakor újraépül. Az Obx nem igényel feliratkozást, dispose-t vagy Builder függvényeket — elég a widgetet Obx-ba csomagolni és egy Rx-változót használni benne. Az Obx automatikusan követi, hogy mely Rx-változók használatosak, és csak azok változásakor rajzol újra.
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-változók: .obs — getter, amely bármilyen értéket Rx-objektumba csomagol. A GetX típusos Rx-osztályokat biztosít: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Minden Rx-változó úgy viselkedik, mint egy közönséges primitív: count++, name.value = 'Hello', items.add(item). A változás automatikusan értesíti az Obx feliratkozókat.
GetBuilder — alternatíva az Obx-hez Rx nélkül, amely manuális update() hívással működik. GetBuilder.filter — pontszerű frissítéshez ID-kulcsok alapján. Az Obx gyorsabb (automatikus függőségkövetés), a GetBuilder kiszámíthatóbb (explicit frissítéshívás). Az Obx egyszerű forgatókönyvekhez, a GetBuilder összetett, több függőséggel rendelkező widgetekhez ajánlott.
GetxController — alaposztály az üzleti logikához életciklus-támogatással. A GetxController a következő metódusokkal rendelkezik: onInit() (inicializálás), onReady() (az első képkocka után), onClose() (erőforrások felszabadítása). Ellentétben a ChangeNotifier és StateNotifier osztályokkal, a GetxController automatikusan kezeli a feliratkozásokat: az oldal megsemmisítésekor az összes Rx-változó és Workers leiratkozik.
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 — a GetX reaktív segédprogramjai: ever (minden változásnál meghívódik), once (csak az első változásnál), debounce (késleltetéssel), interval (legfeljebb N-szer másodpercenként). A Workers tipikus feladatokat oldanak meg: mezővalidáció (debounce), analitika (once), szinkronizáció (ever). A Workers automatikusan leiratkoznak az onClose() hívásakor, megelőzve a memóriaszivárgást.
GetX navigáció nem igényel BuildContext-et a képernyők közötti váltáshoz. A Navigator.push(context, MaterialPageRoute(...)) helyett a Get.to(NextScreen()) használatos — hívás bárhonnan, beleértve a Controller-t is BuildContext hozzáférés nélkül. A GetX támogatja az elnevezett útvonalakat, animációkat, middleware-t és argumentumátadást MaterialPageRoute nélkül.
// Szokásos navigáció
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // aktuális útvonal cseréje
Get.offAll(HomeScreen()); // verem törlése
// Elnevezett útvonalak
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// Middleware
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage és GetPages: A GetX a routes helyett GetPages-t használ a MaterialApp-ben. Middleware — engedélyezés ellenőrzése, átirányítások, analitika a képernyőre lépés előtt. Transition — beépített átmeneti animációk: fadeIn, zoom, leftToRight, topToBottom. Bindings — osztály, amely inicializálja a Controller-t és a függőségeket az útvonalra lépéskor. A Bindings megoldja a lusta inicializálás problémáját: a Controller csak akkor jön létre, amikor a képernyő nyitva van.
Get.put — példány regisztrálása a DI-konténerben. Get.find — példány lekérése a konténerből. Get.lazyPut — lusta inicializálás (az első find híváskor jön létre). Get.putAsync — aszinkron inicializálás (init-es szolgáltatásokhoz). Get.delete — törlés a konténerből (automatikusan meghívja a Bindings az útvonal megsemmisítésekor).
| Metódus | Mikor jön létre | Mikor törlődik |
|---|---|---|
| Get.put | Azonnal | Get.delete vagy onClose |
| Get.lazyPut | Az első find-nél | Get.delete vagy onClose |
| Get.putAsync | A Future végrehajtása után | Get.delete vagy onClose |
| Get.create | Minden find-nél (új gyár) | Nem |
GetX DI — a legegyszerűbb DI-konténer a Flutter-ben. Nincs Provider-fa, nincs Module, nincs Scope. A Get.put(Repository()) a Controller-ben vagy a main.dart-ban az objektumot bárhol elérhetővé teszi az alkalmazásban a Get.find<Repository>() segítségével. A GetX DI támogatja a címkézést (tag: 'api') és az állandóságot (permanent: true) a törlés megelőzésére.
A GetX teljesítménye az Rx-burkolókon alapul, amelyek a GetStream-en — egy Flutter-re optimalizált saját Stream implementáción — keresztül működnek. A GetX benchmarkok szerint az Rx-változók 2-3-szor gyorsabbak, mint a ChangeNotifier és 5-7-szer gyorsabbak, mint a BLoC gyakori frissítéseknél (30+ fps). A GetX nem használ BuildContext-et a feliratkozásokhoz, ami kiküszöböli a widget-fa újraépítését navigáció során.
Best practices: használjon GetBuilder-t az Obx helyett a sok gyermekelemű widgetekhez (listák, táblázatok). Ossza fel a Controller-eket funkcionális modulokra, ne egy hatalmas Controller-t használjon oldalanként. Használjon Bindings-et a Controller inicializálásához, ne Get.put-ot a build metódusban. GetView — egy lerövidített StatelessWidget Controller hozzáféréssel a controller-n keresztül Get.find nélkül.
Ismert korlátozások: A GetX globális változókat használ (Get.find, Get.to), ami megnehezítheti a tesztelést. A függőségek mockolása GetX-en keresztül Get.replace() vagy Get.reset() hívásokat igényel a tesztek között. Az elkülönítéshez a Get.testMode = true ajánlott. A GetX nem ajánlott olyan alkalmazásokhoz, amelyek szigorú architektúrát igényelnek egyértelmű réteghatárokkal — ebben az esetben a BLoC vagy a Riverpod kódgenerálással előnyösebb.
Gyakran Ismételt Kérdések
GetX — mikro-keretrendszer saját DI-vel, navigációval és Rx-reaktivitással. Provider — csak állapotkezelés ChangeNotifier és InheritedWidget segítségével. A GetX nem igényel BuildContext-et, beépített navigációval és DI-vel rendelkezik, 60-70%-kal csökkenti a boilerplate-et. A Provider a szabványos Flutter Navigator-t használja és külső megoldásokat igényel a DI-hez. A GetX gyorsabb a fejlesztésben, a Provider — közelebb áll a natív Flutter API-hoz.
Workers — segédprogramok az Rx-változók változásainak reaktív feldolgozására. ever — callback minden változásnál, once — csak az elsőnél, debounce — késleltetéssel (keresőmezőhöz), interval — legfeljebb N-szer (analitikához). A Workers az onInit() GetxController-ben deklarálódnak és automatikusan leiratkoznak az onClose()-ban. Ez helyettesíti a kézi addListener/removeListener-t ChangeNotifier-rel.
A GetX Get.testMode = true lehetőséget biztosít a tesztmód aktiválásához. A függőségek a Get.replace<Service>(mockService) segítségével cserélhetők. A tesztek között a Get.reset() hívódik meg a DI-konténer tisztításához. A Controller-ek közvetlenül tesztelhetők Flutter nélkül: final c = CounterController(); c.increment(); expect(c.count.value, 1). Az Obx-es widgetekhez használjon tester.pumpWidget-et InjectMocker-rel.
A GetX bármilyen méretű projekthez alkalmas, de fegyelmet igényel. Nagy projektekhez (10+ képernyő) használjon: Bindings-et a Controller-ek elkülönítéséhez, modulokat (GetPages fájlok funkciók szerint), GetView-t a kézi Get.find helyett a build-ben. A fő kockázat — a globális hozzáférés visszaélése (Get.find bárhol). Szigorú code review és architekturális útmutatók megoldják ezt a problémát. Sok millió felhasználós éles alkalmazás fut GetX-en.
Bindings — osztály, amely összekapcsolja az útvonalat a függőségeivel. A képernyőre lépéskor a Binding létrehozza a Controller-t és a szolgáltatásokat a Get.lazyPut segítségével, kilépéskor törli őket. A Bindings lusta inicializálást valósítanak meg: a Controller nem létezik a memóriában, amíg a képernyő nincs megnyitva. Ez RAM-ot és alkalmazásindítási időt takarít meg. A GetPage-ben deklarálható: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is