GetX — lehký mikroframework pro Flutter, který spojuje správu stavu, navigaci a vkládání závislostí do jednoho balíčku. Vyvinutý Amirem Hosseinem Abdorashidim, GetX nabízí minimální boilerplate: bez Stream, bez ChangeNotifier, bez BuildContext pro navigaci. Podle údajů pub.dev získal GetX více než 13 tisíc likeů a stal se jedním z nejoblíbenějších Flutter balíčků.
Hlavní body
GetX — all-in-one mikroframework pro Flutter, který řeší tři hlavní vývojové úkoly: správu stavu (State Management), navigaci (Routing) a vkládání závislostí (DI). GetX nevyžaduje Stream, ChangeNotifier, Buildery ani odběry — veškerou reaktivitu zajišťují Rx-obaly založené na GetValue a GetStream, které pracují desítkykrát rychleji než ChangeNotifier.
GetX se profiluje jako alternativa ke kombinaci Provider + Navigator + get_it/kiwi. Místo instalace tří různých balíčků a psaní 10 řádků konfigurace poskytuje GetX vše z jednoho balíčku s jedním řádkem: GetMaterialApp místo MaterialApp. Navigace funguje přes Get.to(NextScreen()) bez BuildContext a DI — přes Get.put(Service()) bez stromu Provider.
Podle Flutter Community Survey 2025 se GetX používá ve 43 % Flutter projektů. Hlavní důvody výběru: minimální vstupní práh (5 minut na naučení), žádný boilerplate (kód je o 60-70 % kratší ve srovnání s Providerem nebo BLoC) a rychlý vývoj MVP. Kritici poukazují na porušení principu oddělení odpovědností a obtížnost ladění.
Obx — reaktivní widget GetX, který se přestaví při změně Rx-proměnných. Obx nevyžaduje odběr, dispose ani funkce Builder — stačí widget zabalit do Obx a uvnitř použít Rx-proměnnou. Obx automaticky sleduje, které Rx-proměnné jsou použity, a překresluje pouze při jejich změně.
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-proměnné: .obs — getter, který zabalí libovolnou hodnotu do Rx-objektu. GetX poskytuje typované Rx-třídy: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Všechny Rx-proměnné se chovají jako běžná primitiva: count++, name.value = 'Hello', items.add(item). Změna automaticky informuje odběratele Obx.
GetBuilder — alternativa k Obx bez Rx, fungující pomocí ručního volání update(). GetBuilder.filter — pro cílenou aktualizaci podle ID klíčů. Obx je rychlejší (automatické sledování závislostí), GetBuilder předvídatelnější (explicitní volání aktualizace). Obx se doporučuje pro jednoduché scénáře a GetBuilder pro složité widgety s mnoha závislostmi.
GetxController — základní třída pro obchodní logiku s podporou životního cyklu. GetxController má metody: onInit() (inicializace), onReady() (po prvním snímku), onClose() (uvolnění zdrojů). Na rozdíl od ChangeNotifier a StateNotifier, GetxController automaticky spravuje odběry: při zničení stránky se všechny Rx-proměnné a Workers odhlásí.
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 — reaktivní nástroje GetX: ever (volá se při každé změně), once (pouze při první změně), debounce (se zpožděním), interval (maximálně Nkrát za sekundu). Workers řeší typické úkoly: validaci polí (debounce), analytiku (once), synchronizaci (ever). Workers se automaticky odhlašují při volání onClose(), čímž zabraňují únikům paměti.
Navigace GetX nevyžaduje BuildContext pro přechod mezi obrazovkami. Místo Navigator.push(context, MaterialPageRoute(...)) se používá Get.to(NextScreen()) — volání odkudkoli, včetně Controlleru bez přístupu k BuildContext. GetX podporuje pojmenované trasy, animace, middleware a předávání argumentů bez MaterialPageRoute.
// Běžná navigace
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // nahradit aktuální trasu
Get.offAll(HomeScreen()); // vyčistit zásobník
// Pojmenované trasy
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// Middleware
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage a GetPages: GetX používá GetPages místo routes v MaterialApp. Middleware — kontrola autorizace, přesměrování, analytika před vstupem na obrazovku. Transition — vestavěné přechodové animace: fadeIn, zoom, leftToRight, topToBottom. Bindings — třída, která inicializuje Controller a závislosti při vstupu na trasu. Bindings řeší problém líné inicializace: Controller je vytvořen pouze když je obrazovka otevřená.
Get.put — registrace instance v DI-kontejneru. Get.find — získání instance z kontejneru. Get.lazyPut — líná inicializace (vytvoří se při prvním volání find). Get.putAsync — asynchronní inicializace (pro služby s init). Get.delete — odstranění z kontejneru (automaticky voláno Bindings při zničení trasy).
| Metoda | Kdy je vytvořena | Kdy je smazána |
|---|---|---|
| Get.put | Okamžitě | Get.delete nebo onClose |
| Get.lazyPut | Při prvním find | Get.delete nebo onClose |
| Get.putAsync | Po provedení Future | Get.delete nebo onClose |
| Get.create | Při každém find (nová továrna) | Ne |
GetX DI — nejjednodušší DI-kontejner ve Flutter. Žádný strom Provider, žádný Module, žádný Scope. Get.put(Repository()) v Controlleru nebo main.dart zpřístupňuje objekt kdekoli v aplikaci přes Get.find<Repository>(). GetX DI také podporuje tagování (tag: 'api') a trvalost (permanent: true) pro zabránění odstranění.
Výkon GetX je založen na Rx-obalech pracujících přes GetStream — vlastní implementaci Streamu optimalizovanou pro Flutter. Podle benchmarků GetX jsou Rx-proměnné 2-3krát rychlejší než ChangeNotifier a 5-7krát rychlejší než BLoC při častých aktualizacích (30+ fps). GetX nepoužívá BuildContext pro odběry, což eliminuje přestavbu stromu widgetů při navigaci.
Best practices: používejte GetBuilder místo Obx pro widgety s velkým počtem podřízených prvků (seznamy, tabulky). Rozdělujte Controllery podle funkčních modulů, ne jeden obrovský Controller na stránku. Používejte Bindings pro inicializaci Controlleru, ne Get.put v build metodě. GetView — zkrácený StatelessWidget s přístupem k Controlleru přes controller bez Get.find.
Známá omezení: GetX používá globální proměnné (Get.find, Get.to), což může ztížit testování. Mockování závislostí přes GetX vyžaduje Get.replace() nebo Get.reset() mezi testy. Pro izolaci se doporučuje Get.testMode = true. GetX se nedoporučuje pro aplikace vyžadující striktní architekturu s jasnými hranicemi vrstev — v tomto případě je preferován BLoC nebo Riverpod s generováním kódu.
Často kladené otázky
GetX — mikroframework s vlastním DI, navigací a Rx-reaktivitou. Provider — pouze správa stavu přes ChangeNotifier a InheritedWidget. GetX nevyžaduje BuildContext, má vestavěnou navigaci a DI, snižuje boilerplate o 60-70 %. Provider používá standardní Flutter Navigator a vyžaduje externí řešení pro DI. GetX je rychlejší ve vývoji, Provider — bližší nativnímu Flutter API.
Workers — nástroje pro reaktivní zpracování změn Rx-proměnných. ever — callback při každé změně, once — pouze při první, debounce — se zpožděním (pro vyhledávací pole), interval — maximálně Nkrát (pro analytiku). Workers se deklarují v onInit() GetxController a automaticky se odhlašují v onClose(). To nahrazuje ruční addListener/removeListener s ChangeNotifier.
GetX poskytuje Get.testMode = true pro aktivaci testovacího režimu. Závislosti se nahrazují přes Get.replace<Service>(mockService). Mezi testy se volá Get.reset() pro vyčištění DI-kontejneru. Controllery se testují přímo bez Flutter: final c = CounterController(); c.increment(); expect(c.count.value, 1). Pro widgety s Obx použijte tester.pumpWidget s InjectMocker.
GetX je vhodný pro projekty jakékoli velikosti, ale vyžaduje disciplínu. Pro velké projekty (10+ obrazovek) používejte: Bindings pro izolaci Controllerů, moduly (soubory GetPages podle funkcionality), GetView místo ručního Get.find v build. Hlavní riziko — zneužití globálního přístupu (Get.find kdekoli). Přísné code review a architektonické pokyny tento problém řeší. Mnoho produkčních aplikací s miliony uživatelů běží na GetX.
Bindings — třída spojující trasu s jejími závislostmi. Při vstupu na obrazovku Binding vytváří Controller a služby přes Get.lazyPut, při výstupu je odstraňuje. Bindings implementují línou inicializaci: Controller neexistuje v paměti, dokud není obrazovka otevřena. To šetří RAM a dobu spouštění aplikace. Deklaruje se v GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také