GetX: кључни појмови, навигација и DI у Flutter-у

Аутор: IT Sectr Објављено: 2026-02-19 Време читања: 7 мин

GetX — лагани микро-оквир за Flutter који обједињује управљање стањем, навигацију и убризгавање зависности у једном пакету. Развијен од стране Амир Хосеин Абдорашидија, GetX нуди минималан boilerplate: без Stream, без ChangeNotifier, без BuildContext за навигацију. Према подацима pub.dev, GetX је прикупио преко 13 хиљада лајкова, поставши један од најпопуларнијих Flutter пакета.

Главно

  • Obx — реактивни виџет који се преграђује при промени Rx-променљиве
  • GetController — класа пословне логике са методама и Rx-променљивим
  • Get.to — навигација без BuildContext кроз именоване руте
  • Get.put / Get.find — убризгавање и добијање зависности кроз DI-контејнер
  • Rx-променљиве — реактивни омотачи (RxInt, RxString, RxBool) са аутоматским обавештавањем

Шта је GetX?

GetX — all-in-one микро-оквир за Flutter који решава три главна развојна задатка: управљање стањем (State Management), навигацију (Routing) и убризгавање зависности (DI). GetX не захтева Stream, ChangeNotifier, Builder-е или претплате — сву реактивност обезбеђују Rx-омотачи засновани на GetValue и GetStream, који раде десетинама пута брже од ChangeNotifier-а.

GetX се позиционира као алтернатива комбинацији Provider + Navigator + get_it/kiwi. Уместо инсталирања три различита пакета и писања 10 линија конфигурације, GetX даје све из кутије са једном линијом: GetMaterialApp уместо MaterialApp. Навигација ради кроз Get.to(NextScreen()) без BuildContext, а DI — кроз Get.put(Service()) без Provider-стабла.

Према Flutter Community Survey 2025, GetX се користи у 43% Flutter пројеката. Главни разлози одабира: минимални праг уласка (5 минута за савладавање), одсуство boilerplate-а (код се скраћује за 60-70% у поређењу са Provider или BLoC) и брзи развој MVP-а. Критичари истичу кршење принципа одвајања одговорности и тешкоће у отклањању грешака.

Реактивно стање: Obx и Rx

Obx — реактивни виџет GetX-а који се преграђује при промени Rx-променљивих. Obx не захтева претплату, dispose или Builder-функције — довољно је умотати виџет у Obx и користити Rx-променљиву унутра. Obx аутоматски прати које Rx-променљиве се користе и прецртава само при њиховој промени.

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-променљиве: .obs — гетер који умотава било коју вредност у Rx-објекат. GetX пружа типизоване Rx-класе: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Све Rx-променљиве се понашају као обични примитиви: count++, name.value = 'Hello', items.add(item). Промена аутоматски обавештава Obx-претплатнике.

GetBuilder — алтернатива Obx-у без Rx, која ради кроз ручно позивање update(). GetBuilder.filter — за тачкасто ажурирање по ID-кључевима. Obx је бржи (аутоматско праћење зависности), GetBuilder предвидљивији (експлицитно позивање ажурирања). Препоручује се Obx за једноставне сценарије и GetBuilder за сложене виџете са више зависности.

GetController и животни циклус

GetxController — базна класа за пословну логику са подршком за животни циклус. GetxController има методе: onInit() (иницијализација), onReady() (после првог фрејма), onClose() (чишћење ресурса). За разлику од ChangeNotifier и StateNotifier, GetxController аутоматски управља претплатама: при уништењу странице, све Rx-променљиве и Workers се одјављују.

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-а: ever (позива се при свакој промени), once (само при првој промени), debounce (са закашњењем), interval (не чешће од N пута у секунди). Workers решавају типичне задатке: валидација поља (debounce), аналитика (once), синхронизација (ever). Workers се аутоматски одјављују при позиву onClose(), спречавајући цурење меморије.

GetX навигација не захтева BuildContext за прелазак између екрана. Уместо Navigator.push(context, MaterialPageRoute(...)) користи се Get.to(NextScreen()) — позив из било ког места, укључујући Controller без приступа BuildContext-у. GetX подржава именоване руте, анимације, middleware и прослеђивање аргумената без MaterialPageRoute.

Dart
// Обична навигација
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // замени тренутну руту
Get.offAll(HomeScreen()); // очисти стек

// Именоване руте
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

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

GetPage и GetPages: GetX користи GetPages уместо routes у MaterialApp. Middleware — провера ауторизације, преусмеравања, аналитика пре уласка на екран. Transition — уграђене анимације прелаза: fadeIn, zoom, leftToRight, topToBottom. Bindings — класа која иницијализује Controller и зависности при уласку на руту. Bindings решавају проблем лење иницијализације: Controller се креира само када је екран отворен.

Убризгавање зависности са GetX

Get.put — регистрација инстанце у DI-контејнеру. Get.find — добијање инстанце из контејнера. Get.lazyPut — лења иницијализација (креира се при првом позиву find). Get.putAsync — асинхрона иницијализација (за сервисе са init). Get.delete — брисање из контејнера (аутоматски позива Bindings при уништењу руте).

МетодКада се креираКада се брише
Get.putОдмахGet.delete или onClose
Get.lazyPutПри првом findGet.delete или onClose
Get.putAsyncНакон извршења FutureGet.delete или onClose
Get.createПри сваком find (нова фабрика)Не

GetX DI — најједноставнији DI-контејнер у Flutter-у. Нема Provider-стабла, нема Module, нема Scope. Get.put(Repository()) у Controller-у или main.dart чини објекат доступним било где у апликацији кроз Get.find<Repository>(). GetX DI такође подржава означавање (tag: 'api') и перманентност (permanent: true) за спречавање брисања.

GetX: best practices и перформансе

Перформансе GetX-а се заснивају на Rx-омотачима који раде кроз GetStream — сопствену имплементацију Stream-а оптимизовану за Flutter. Према бенчмарковима GetX-а, Rx-променљиве су 2-3 пута брже од ChangeNotifier-а и 5-7 пута брже од BLoC-а при честим ажурирањима (30+ fps). GetX не користи BuildContext за претплате, што елиминише преграђивање стабла виџета при навигацији.

Best practices: користите GetBuilder уместо Obx за виџете са великим бројем дечијих елемената (листе, табеле). Раздвајајте Controller-е по функционалним модулима, а не један огроман Controller по страници. Користите Bindings за иницијализацију Controller-а, а не Get.put у build-методу. GetView — скраћени StatelessWidget са приступом Controller-у кроз controller без Get.find.

Позната ограничења: GetX користи глобалне променљиве (Get.find, Get.to), што може отежати тестирање. Моковање зависности кроз GetX захтева Get.replace() или Get.reset() између тестова. За изолацију се препоручује Get.testMode = true. GetX се не препоручује за апликације које захтевају строгу архитектуру са јасним границама слојева — у том случају је пожељнији BLoC или Riverpod са код-генерацијом.

Често постављана питања

По чему се GetX разликује од Provider-а?

GetX — микро-оквир са сопственим DI, навигацијом и Rx-реактивношћу. Provider — само управљање стањем кроз ChangeNotifier и InheritedWidget. GetX не захтева BuildContext, има уграђену навигацију и DI, смањује boilerplate за 60-70%. Provider користи стандардни Flutter Navigator и захтева спољна решења за DI. GetX је бржи у развоју, Provider — ближи изворном Flutter API-ју.

Шта су GetX Workers?

Workers — алати за реактивну обраду промена Rx-променљивих. ever — повратни позив при свакој промени, once — само при првој, debounce — са закашњењем (за поље за претрагу), interval — не чешће од N пута (за аналитику). Workers се декларишу у onInit() GetxController-а и аутоматски се одјављују у onClose(). Ово замењује ручно addListener/removeListener са ChangeNotifier-ом.

Како тестирати GetX?

GetX пружа Get.testMode = true за укључивање тестног режима. Зависности се замењују кроз Get.replace<Service>(mockService). Између тестова се позива Get.reset() за чишћење DI-контејнера. Controller-и се тестирају директно без Flutter-а: final c = CounterController(); c.increment(); expect(c.count.value, 1). За виџете са Obx користите tester.pumpWidget са InjectMocker-ом.

Да ли вреди користити GetX за велике пројекте?

GetX је погодан за пројекте било које величине, али захтева дисциплину. За велике пројекте (10+ екрана) користите: Bindings за изолацију Controller-а, модуле (GetPages датотеке по функционалности), GetView уместо ручног Get.find у build-у. Главни ризик — злоупотреба глобалног приступа (Get.find било где). Строги code review и архитектонски водичи решавају овај проблем. Многе продукционе апликације са милионима корисника раде на GetX-у.

Шта су GetX Bindings?

Bindings — класа која повезује руту са њеним зависностима. При уласку на екран, Binding креира Controller и сервисе кроз Get.lazyPut, при изласку — брише их. Bindings имплементирају лењу иницијализацију: Controller не постоји у меморији док екран није отворен. Ово штеди RAM и време покретања апликације. Декларише се у GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Резиме

  • GetX — Flutter микро-оквир са управљањем стањем, навигацијом и DI у једном пакету
  • Obx и Rx — реактивни омотачи са аутоматским прецртавањем без Stream и ChangeNotifier
  • GetxController — класа пословне логике са животним циклусом onInit/onReady/onClose
  • Get.to / Get.back — навигација без BuildContext са уграђеним анимацијама
  • Get.put / Get.find — DI-контејнер без Provider-стабла са лењом иницијализацијом
  • Workers — ever, once, debounce, interval за реактивну обраду промена
  • Bindings — лења иницијализација Controller-а при отварању руте са аутоматским диспоузингом

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође