GetX: concepte cheie, navigare și DI în Flutter

Autor: IT Sectr Publicat: 2026-02-19 Timp de citire: 7 min

GetX — un micro-framework ușor pentru Flutter care combină gestionarea stării, navigarea și injectarea dependențelor într-un singur pachet. Creat de Amir Hossein Abdorashidi, GetX oferă un boilerplate minim: fără Stream, fără ChangeNotifier, fără BuildContext pentru navigare. Conform datelor pub.dev, GetX a strâns peste 13 mii de like-uri, devenind unul dintre cele mai populare pachete Flutter.

Esențial

  • Obx — widget reactiv care se reconstruiește la schimbarea variabilei Rx
  • GetController — clasă de logică de afaceri cu metode și variabile Rx
  • Get.to — navigare fără BuildContext prin rute denumite
  • Get.put / Get.find — injectarea și obținerea dependențelor prin containerul DI
  • Variabile Rx — învelișuri reactive (RxInt, RxString, RxBool) cu notificare automată

Ce este GetX?

GetX — un micro-framework all-in-one pentru Flutter care rezolvă trei sarcini principale de dezvoltare: gestionarea stării (State Management), navigarea (Routing) și injectarea dependențelor (DI). GetX nu necesită Stream, ChangeNotifier, Builders sau abonamente — întreaga reactivitate este asigurată de învelișurile Rx bazate pe GetValue și GetStream, care funcționează de zeci de ori mai rapid decât ChangeNotifier.

GetX se poziționează ca o alternativă la combinația Provider + Navigator + get_it/kiwi. În loc să instalezi trei pachete diferite și să scrii 10 linii de configurare, GetX oferă totul din cutie cu o singură linie: GetMaterialApp în loc de MaterialApp. Navigarea funcționează prin Get.to(NextScreen()) fără BuildContext, iar DI — prin Get.put(Service()) fără arborele Provider.

Conform Flutter Community Survey 2025, GetX este utilizat în 43% din proiectele Flutter. Principalele motive de alegere: prag minim de intrare (5 minute pentru învățare), lipsa boilerplate-ului (codul se reduce cu 60-70% comparativ cu Provider sau BLoC) și dezvoltarea rapidă a MVP-urilor. Criticii menționează încălcarea principiului separării responsabilităților și dificultatea de depanare.

Stare reactivă: Obx și Rx

Obx — widgetul reactiv GetX care se reconstruiește la schimbarea variabilelor Rx. Obx nu necesită abonament, dispose sau funcții Builder — este suficient să înfășori widgetul în Obx și să folosești o variabilă Rx în interior. Obx urmărește automat ce variabile Rx sunt utilizate și redesenează doar la modificarea acestora.

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

Variabile Rx: .obs — getter care înfășoară orice valoare într-un obiect Rx. GetX oferă clase Rx tipizate: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Toate variabilele Rx se comportă ca primitive obișnuite: count++, name.value = 'Hello', items.add(item). Modificarea notifică automat abonații Obx.

GetBuilder — alternativă la Obx fără Rx, care funcționează prin apelul manual update(). GetBuilder.filter — pentru actualizare punctuală după chei ID. Obx este mai rapid (urmărire automată a dependențelor), GetBuilder mai previzibil (apel explicit de actualizare). Se recomandă Obx pentru scenarii simple și GetBuilder pentru widgeturi complexe cu multiple dependențe.

GetController și ciclul de viață

GetxController — clasa de bază pentru logica de afaceri cu suport pentru ciclul de viață. GetxController are metodele: onInit() (inițializare), onReady() (după primul frame), onClose() (curățarea resurselor). Spre deosebire de ChangeNotifier și StateNotifier, GetxController gestionează automat abonamentele: la distrugerea paginii, toate variabilele Rx și Workers sunt dezabonate.

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 — utilitare reactive GetX: ever (se apelează la fiecare schimbare), once (doar la prima schimbare), debounce (cu întârziere), interval (nu mai des de N ori pe secundă). Workers rezolvă sarcini tipice: validare câmpuri (debounce), analitică (once), sincronizare (ever). Workers sunt dezabonați automat la apelul onClose(), prevenind scurgerile de memorie.

Navigarea GetX nu necesită BuildContext pentru trecerea între ecrane. În loc de Navigator.push(context, MaterialPageRoute(...)) se folosește Get.to(NextScreen()) — apel din orice loc, inclusiv Controller fără acces la BuildContext. GetX suportă rute denumite, animații, middleware și transmiterea de argumente fără MaterialPageRoute.

Dart
// Navigare obișnuită
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // înlocuiește ruta curentă
Get.offAll(HomeScreen()); // golește stiva

// Rute denumite
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

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

GetPage și GetPages: GetX folosește GetPages în loc de routes în MaterialApp. Middleware — verificarea autorizării, redirecționări, analitică înainte de intrarea pe ecran. Transition — animații de tranziție încorporate: fadeIn, zoom, leftToRight, topToBottom. Bindings — clasă care inițializează Controllerul și dependențele la intrarea pe rută. Bindings rezolvă problema inițializării leneșe: Controllerul este creat doar când ecranul este deschis.

Injectarea dependențelor cu GetX

Get.put — înregistrarea instanței în containerul DI. Get.find — obținerea instanței din container. Get.lazyPut — inițializare leneșă (se creează la primul apel find). Get.putAsync — inițializare asincronă (pentru servicii cu init). Get.delete — ștergerea din container (se apelează automat de Bindings la distrugerea rutei).

MetodăCând se creeazăCând se șterge
Get.putImediatGet.delete sau onClose
Get.lazyPutLa primul findGet.delete sau onClose
Get.putAsyncDupă executarea FutureGet.delete sau onClose
Get.createLa fiecare find (fabrică nouă)Nu

GetX DI — cel mai simplu container DI în Flutter. Fără arbore Provider, fără Module, fără Scope. Get.put(Repository()) în Controller sau main.dart face obiectul disponibil oriunde în aplicație prin Get.find<Repository>(). GetX DI suportă și etichetarea (tag: 'api') și permanența (permanent: true) pentru prevenirea ștergerii.

GetX: best practices și performanță

Performanța GetX se bazează pe învelișurile Rx care funcționează prin GetStream — o implementare proprie Stream optimizată pentru Flutter. Conform benchmark-urilor GetX, variabilele Rx sunt de 2-3 ori mai rapide decât ChangeNotifier și de 5-7 ori mai rapide decât BLoC la actualizări frecvente (30+ fps). GetX nu folosește BuildContext pentru abonamente, ceea ce elimină reconstruirea arborelui de widgeturi la navigare.

Best practices: folosește GetBuilder în loc de Obx pentru widgeturi cu un număr mare de elemente copil (liste, tabele). Împarte Controllerele pe module funcționale, nu un singur Controller uriaș pe pagină. Folosește Bindings pentru inițializarea Controllerului, nu Get.put în metoda build. GetView — un StatelessWidget scurtat cu acces la Controller prin controller fără Get.find.

Limitări cunoscute: GetX folosește variabile globale (Get.find, Get.to), ceea ce poate îngreuna testarea. Mockarea dependențelor prin GetX necesită Get.replace() sau Get.reset() între teste. Pentru izolare se recomandă Get.testMode = true. GetX nu este recomandat pentru aplicații care necesită o arhitectură strictă cu granițe clare între straturi — în acest caz, BLoC sau Riverpod cu generare de cod sunt preferabile.

Întrebări frecvente

Cu ce se deosebește GetX de Provider?

GetX — micro-framework cu propriul DI, navigare și reactivitate Rx. Provider — doar gestionarea stării prin ChangeNotifier și InheritedWidget. GetX nu necesită BuildContext, are navigare și DI încorporate, reduce boilerplate-ul cu 60-70%. Provider folosește Navigatorul standard Flutter și necesită soluții terțe pentru DI. GetX este mai rapid în dezvoltare, Provider — mai apropiat de API-ul Flutter nativ.

Ce sunt GetX Workers?

Workers — utilitare pentru procesarea reactivă a modificărilor variabilelor Rx. ever — callback la fiecare schimbare, once — doar la prima, debounce — cu întârziere (pentru câmpul de căutare), interval — nu mai des de N ori (pentru analitică). Workers se declară în onInit() al GetxController și se dezabonează automat în onClose(). Aceasta înlocuiește addListener/removeListener manual cu ChangeNotifier.

Cum se testează GetX?

GetX oferă Get.testMode = true pentru activarea modului de test. Dependențele se înlocuiesc prin Get.replace<Service>(mockService). Între teste se apelează Get.reset() pentru curățarea containerului DI. Controllerele se testează direct fără Flutter: final c = CounterController(); c.increment(); expect(c.count.value, 1). Pentru widgeturi cu Obx folosește tester.pumpWidget cu InjectMocker.

Merită să folosești GetX pentru proiecte mari?

GetX este potrivit pentru proiecte de orice dimensiune, dar necesită disciplină. Pentru proiecte mari (10+ ecrane) folosește: Bindings pentru izolarea Controllerelor, module (fișiere GetPages pe funcționalitate), GetView în loc de Get.Find manual în build. Riscul principal — abuzul de acces global (Get.find oriunde). Code review-uri riguroase și ghiduri arhitecturale rezolvă această problemă. Multe aplicații de producție cu milioane de utilizatori funcționează pe GetX.

Ce sunt GetX Bindings?

Bindings — clasă care leagă ruta de dependențele sale. La intrarea pe ecran, Binding creează Controllerul și serviciile prin Get.lazyPut, la ieșire — le șterge. Bindings implementează inițializarea leneșă: Controllerul nu există în memorie până când ecranul nu este deschis. Aceasta economisește RAM și timpul de pornire a aplicației. Se declară în GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Rezumat

  • GetX — micro-framework Flutter cu gestionarea stării, navigare și DI într-un singur pachet
  • Obx și Rx — învelișuri reactive cu redeseneare automată fără Stream și ChangeNotifier
  • GetxController — clasă de logică de afaceri cu ciclu de viață onInit/onReady/onClose
  • Get.to / Get.back — navigare fără BuildContext cu animații încorporate
  • Get.put / Get.find — container DI fără arbore Provider cu inițializare leneșă
  • Workers — ever, once, debounce, interval pentru procesarea reactivă a schimbărilor
  • Bindings — inițializare leneșă a Controllerului la deschiderea rutei cu auto-disposal

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și