GetX — een lichtgewicht micro-framework voor Flutter dat state management, navigatie en dependency injection in één pakket combineert. Ontwikkeld door Amir Hossein Abdorashidi, biedt GetX minimale boilerplate: zonder Stream, zonder ChangeNotifier, zonder BuildContext voor navigatie. Volgens gegevens van pub.dev heeft GetX meer dan 13.000 likes verzameld en is het een van de populairste Flutter-pakketten geworden.
Belangrijkste punten
GetX — een all-in-one micro-framework voor Flutter dat drie hoofdtaken van ontwikkeling oplost: state management, routing en dependency injection (DI). GetX vereist geen Stream, ChangeNotifier, Builders of abonnementen — alle reactiviteit wordt verzorgd door Rx-wrappers op basis van GetValue en GetStream, die tientallen keren sneller werken dan ChangeNotifier.
GetX positioneert zich als alternatief voor de combinatie Provider + Navigator + get_it/kiwi. In plaats van drie verschillende pakketten te installeren en 10 regels configuratie te schrijven, biedt GetX alles uit één doos met één regel: GetMaterialApp in plaats van MaterialApp. Navigatie werkt via Get.to(NextScreen()) zonder BuildContext, en DI — via Get.put(Service()) zonder Provider-boom.
Volgens Flutter Community Survey 2025 wordt GetX gebruikt in 43% van de Flutter-projecten. Belangrijkste redenen voor keuze: minimale instapdrempel (5 minuten om te leren), geen boilerplate (code wordt 60-70% korter vergeleken met Provider of BLoC) en snelle MVP-ontwikkeling. Critici wijzen op schending van het principe van scheiding van verantwoordelijkheden en moeilijkheden bij debuggen.
Obx — de reactieve widget van GetX die herbouwt bij wijziging van Rx-variabelen. Obx vereist geen abonnement, dispose of Builder-functies — het is voldoende om de widget in Obx te wikkelen en een Rx-variabele erin te gebruiken. Obx volgt automatisch welke Rx-variabelen worden gebruikt en hertekent alleen bij wijziging ervan.
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-variabelen: .obs — getter die elke waarde in een Rx-object wikkelt. GetX biedt getypeerde Rx-klassen: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Alle Rx-variabelen gedragen zich als gewone primitieven: count++, name.value = 'Hello', items.add(item). Wijziging meldt automatisch Obx-abonnees.
GetBuilder — alternatief voor Obx zonder Rx, werkend via handmatige aanroep van update(). GetBuilder.filter — voor gerichte update op ID-sleutels. Obx is sneller (automatische afhankelijkheidsregistratie), GetBuilder is voorspelbaarder (expliciete update-aanroep). Obx wordt aanbevolen voor eenvoudige scenario's en GetBuilder voor complexe widgets met meerdere afhankelijkheden.
GetxController — de basisklasse voor bedrijfslogica met ondersteuning voor levenscyclus. GetxController heeft methoden: onInit() (initialisatie), onReady() (na het eerste frame), onClose() (opschonen van bronnen). In tegenstelling tot ChangeNotifier en StateNotifier beheert GetxController abonnementen automatisch: bij vernietiging van de pagina worden alle Rx-variabelen en Workers afgemeld.
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 — reactieve hulpprogramma's van GetX: ever (wordt bij elke wijziging aangeroepen), once (alleen bij de eerste wijziging), debounce (met vertraging), interval (niet vaker dan N keer per seconde). Workers lossen typische taken op: veldvalidatie (debounce), analyse (once), synchronisatie (ever). Workers worden automatisch afgemeld bij aanroep van onClose(), waardoor geheugenlekken worden voorkomen.
GetX-navigatie vereist geen BuildContext voor overgang tussen schermen. In plaats van Navigator.push(context, MaterialPageRoute(...)) wordt Get.to(NextScreen()) gebruikt — aanroep vanaf elke locatie, inclusief Controller zonder toegang tot BuildContext. GetX ondersteunt benoemde routes, animaties, middleware en argumentoverdracht zonder MaterialPageRoute.
// Gewone navigatie
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // huidige route vervangen
Get.offAll(HomeScreen()); // stack wissen
// Benoemde routes
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// Middleware
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage en GetPages: GetX gebruikt GetPages in plaats van routes in MaterialApp. Middleware — autorisatiecontrole, redirects, analyse vóór toegang tot het scherm. Transition — ingebouwde overgangsanimaties: fadeIn, zoom, leftToRight, topToBottom. Bindings — klasse die Controller en afhankelijkheden initialiseert bij binnenkomst op de route. Bindings lossen het probleem van lazy-initialisatie op: Controller wordt alleen gemaakt wanneer het scherm open is.
Get.put — registratie van instantie in DI-container. Get.find — ophalen van instantie uit container. Get.lazyPut — lazy-initialisatie (wordt gemaakt bij eerste find-aanroep). Get.putAsync — asynchrone initialisatie (voor services met init). Get.delete — verwijderen uit container (wordt automatisch aangeroepen door Bindings bij vernietiging van de route).
| Methode | Wanneer gemaakt | Wanneer verwijderd |
|---|---|---|
| Get.put | Onmiddellijk | Get.delete of onClose |
| Get.lazyPut | Bij eerste find | Get.delete of onClose |
| Get.putAsync | Na uitvoering van Future | Get.delete of onClose |
| Get.create | Bij elke find (nieuwe factory) | Nee |
GetX DI — de eenvoudigste DI-container in Flutter. Geen Provider-boom, geen Module, geen Scope. Get.put(Repository()) in Controller of main.dart maakt het object overal in de applicatie beschikbaar via Get.find<Repository>(). GetX DI ondersteunt ook tagging (tag: 'api') en permanentie (permanent: true) om verwijdering te voorkomen.
Prestaties van GetX zijn gebaseerd op Rx-wrappers die werken via GetStream — een eigen Stream-implementatie geoptimaliseerd voor Flutter. Volgens GetX-benchmarks zijn Rx-variabelen 2-3 keer sneller dan ChangeNotifier en 5-7 keer sneller dan BLoC bij frequente updates (30+ fps). GetX gebruikt geen BuildContext voor abonnementen, wat herbouw van de widgetboom bij navigatie elimineert.
Best practices: gebruik GetBuilder in plaats van Obx voor widgets met veel onderliggende elementen (lijsten, tabellen). Verdeel Controllers over functionele modules, niet één enorme Controller per pagina. Gebruik Bindings voor initialisatie van Controller, niet Get.put in de build-methode. GetView — een verkorte StatelessWidget met toegang tot Controller via controller zonder Get.find.
Bekende beperkingen: GetX gebruikt globale variabelen (Get.find, Get.to), wat testen kan bemoeilijken. Mocken van afhankelijkheden via GetX vereist Get.replace() of Get.reset() tussen tests. Voor isolatie wordt Get.testMode = true aanbevolen. GetX wordt niet aanbevolen voor applicaties die strikte architectuur met duidelijke laaggrenzen vereisen — in dat geval hebben BLoC of Riverpod met codegeneratie de voorkeur.
Veelgestelde vragen
GetX — micro-framework met eigen DI, navigatie en Rx-reactiviteit. Provider — alleen state management via ChangeNotifier en InheritedWidget. GetX vereist geen BuildContext, heeft ingebouwde navigatie en DI, vermindert boilerplate met 60-70%. Provider gebruikt de standaard Flutter Navigator en vereist externe oplossingen voor DI. GetX is sneller in ontwikkeling, Provider — dichter bij native Flutter API.
Workers — hulpprogramma's voor reactieve verwerking van wijzigingen in Rx-variabelen. ever — callback bij elke wijziging, once — alleen bij de eerste, debounce — met vertraging (voor zoekveld), interval — niet vaker dan N keer (voor analyse). Workers worden gedeclareerd in onInit() van GetxController en automatisch afgemeld in onClose(). Dit vervangt handmatige addListener/removeListener met ChangeNotifier.
GetX biedt Get.testMode = true om testmodus in te schakelen. Afhankelijkheden worden vervangen via Get.replace<Service>(mockService). Tussen tests wordt Get.reset() aangeroepen om de DI-container te wissen. Controllers worden rechtstreeks getest zonder Flutter: final c = CounterController(); c.increment(); expect(c.count.value, 1). Voor widgets met Obx gebruik tester.pumpWidget met InjectMocker.
GetX is geschikt voor projecten van elke grootte, maar vereist discipline. Voor grote projecten (10+ schermen) gebruik: Bindings voor isolatie van Controllers, modules (GetPages-bestanden per functionaliteit), GetView in plaats van handmatige Get.find in build. Het grootste risico — misbruik van globale toegang (Get.find overal). Strenge code reviews en architectuurrichtlijnen lossen dit probleem op. Veel productie-applicaties met miljoenen gebruikers draaien op GetX.
Bindings — klasse die de route koppelt aan zijn afhankelijkheden. Bij binnenkomst op het scherm maakt Binding de Controller en services via Get.lazyPut, bij vertrek verwijdert het ze. Bindings implementeren lazy-initialisatie: Controller bestaat niet in het geheugen totdat het scherm is geopend. Dit bespaart RAM en opstarttijd van de applicatie. Gedeclareerd in GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook