GetX — ein leichtes Mikro-Framework für Flutter, das Zustandsverwaltung, Navigation und Dependency Injection in einem Paket vereint. Entwickelt von Amir Hossein Abdorashidi, bietet GetX minimalen Boilerplate: ohne Stream, ohne ChangeNotifier, ohne BuildContext für Navigation. Laut pub.dev hat GetX über 13.000 Likes erhalten und ist damit eines der beliebtesten Flutter-Pakete.
Wichtige Punkte
GetX — ein All-in-One-Mikro-Framework für Flutter, das drei Hauptentwicklungsaufgaben löst: Zustandsverwaltung, Navigation (Routing) und Dependency Injection (DI). GetX benötigt kein Stream, ChangeNotifier, Builders oder Abonnements — die gesamte Reaktivität wird durch Rx-Wrapper auf Basis von GetValue und GetStream bereitgestellt, die dutzende Male schneller als ChangeNotifier arbeiten.
GetX positioniert sich als Alternative zur Provider + Navigator + get_it/kiwi-Kombination. Statt drei verschiedene Pakete zu installieren und 10 Zeilen Konfiguration zu schreiben, liefert GetX alles sofort mit einer Zeile: GetMaterialApp statt MaterialApp. Navigation funktioniert über Get.to(NextScreen()) ohne BuildContext, und DI über Get.put(Service()) ohne Provider-Baum.
Laut der Flutter Community Survey 2025 wird GetX in 43% der Flutter-Projekte verwendet. Hauptgründe für die Wahl: minimale Einstiegshürde (5 Minuten zum Lernen), kein Boilerplate (Code reduziert sich um 60-70% im Vergleich zu Provider oder BLoC) und schnelle MVP-Entwicklung. Kritiker bemängeln die Verletzung des Prinzips der Trennung von Verantwortlichkeiten und die Komplexität des Debuggings.
Obx — ein reaktives GetX-Widget, das sich bei Änderung von Rx-Variablen neu aufbaut. Obx benötigt kein Abonnement, dispose oder Builder-Funktionen — wickeln Sie das Widget einfach in Obx ein und verwenden Sie eine Rx-Variable darin. Obx verfolgt automatisch, welche Rx-Variablen verwendet werden, und zeichnet nur bei deren Änderung neu.
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-Variablen: .obs — ein Getter, der jeden Wert in ein Rx-Objekt einwickelt. GetX bietet typisierte Rx-Klassen: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Alle Rx-Variablen verhalten sich wie normale Primitive: count++, name.value = 'Hello', items.add(item). Änderungen benachrichtigen automatisch Obx-Abonnenten.
GetBuilder — eine Alternative zu Obx ohne Rx, die über manuelle update()-Aufrufe funktioniert. GetBuilder.filter — für gezielte Updates nach ID-Schlüsseln. Obx ist schneller (automatische Abhängigkeitsverfolgung), GetBuilder ist vorhersagbarer (expliziter Update-Aufruf). Obx wird für einfache Szenarien empfohlen und GetBuilder für komplexe Widgets mit vielen Abhängigkeiten.
GetxController — eine Basisklasse für Geschäftslogik mit Lebenszyklusunterstützung. GetxController hat Methoden: onInit() (Initialisierung), onReady() (nach dem ersten Frame), onClose() (Ressourcenbereinigung). Im Gegensatz zu ChangeNotifier und StateNotifier verwaltet GetxController Abonnements automatisch: Wenn die Seite zerstört wird, werden alle Rx-Variablen und Workers abgemeldet.
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 — reaktive GetX-Dienstprogramme: ever (wird bei jeder Änderung aufgerufen), once (nur bei der ersten Änderung), debounce (mit Verzögerung), interval (nicht öfter als N-mal pro Sekunde). Workers lösen typische Aufgaben: Feldvalidierung (debounce), Analytik (once), Synchronisation (ever). Workers melden sich automatisch ab, wenn onClose() aufgerufen wird, und verhindern so Speicherlecks.
GetX-Navigation benötigt kein BuildContext für den Übergang zwischen Bildschirmen. Statt Navigator.push(context, MaterialPageRoute(...)) wird Get.to(NextScreen()) verwendet — von überall aufrufbar, einschließlich eines Controllers ohne BuildContext-Zugriff. GetX unterstützt benannte Routen, Animationen, Middleware und Argumentübergabe ohne MaterialPageRoute.
// Standardnavigation
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // aktuelle Route ersetzen
Get.offAll(HomeScreen()); // Stack leeren
// Benannte Routen
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// Middleware
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage und GetPages: GetX verwendet GetPages statt routes in MaterialApp. Middleware — Authentifizierungsprüfungen, Weiterleitungen, Analytik vor dem Betreten eines Bildschirms. Transition — integrierte Übergangsanimationen: fadeIn, zoom, leftToRight, topToBottom. Bindings — eine Klasse, die Controller und Abhängigkeiten beim Betreten einer Route initialisiert. Bindings lösen das Problem der verzögerten Initialisierung: Der Controller wird nur erstellt, wenn der Bildschirm geöffnet wird.
Get.put — registriert eine Instanz im DI-Container. Get.find — ruft eine Instanz aus dem Container ab. Get.lazyPut — verzögerte Initialisierung (wird beim ersten find-Aufruf erstellt). Get.putAsync — asynchrone Initialisierung (für Dienste mit init). Get.delete — entfernt aus dem Container (wird automatisch von Bindings aufgerufen, wenn die Route zerstört wird).
| Methode | Wann erstellt | Wann entfernt |
|---|---|---|
| Get.put | Sofort | Get.delete oder onClose |
| Get.lazyPut | Beim ersten find | Get.delete oder onClose |
| Get.putAsync | Nach Future-Abschluss | Get.delete oder onClose |
| Get.create | Bei jedem find (neue Fabrik) | Nein |
GetX DI — der einfachste DI-Container in Flutter. Kein Provider-Baum, kein Module, kein Scope. Get.put(Repository()) in Controller oder main.dart macht das Objekt über Get.find<Repository>() überall in der App zugänglich. GetX DI unterstützt auch Tagging (tag: 'api') und Dauerhaftigkeit (permanent: true), um das Löschen zu verhindern.
GetX-Leistung basiert auf Rx-Wrappern, die über GetStream arbeiten — eine benutzerdefinierte, für Flutter optimierte Stream-Implementierung. Laut GetX-Benchmarks sind Rx-Variablen bei häufigen Updates (30+ fps) 2-3 mal schneller als ChangeNotifier und 5-7 mal schneller als BLoC. GetX verwendet BuildContext nicht für Abonnements, was den Neuaufbau des Widget-Baums während der Navigation eliminiert.
Best Practices: Verwenden Sie GetBuilder statt Obx für Widgets mit vielen Kind-Elementen (Listen, Tabellen). Teilen Sie Controller nach funktionalen Modulen auf, nicht ein riesiger Controller pro Seite. Verwenden Sie Bindings zur Controller-Initialisierung, nicht Get.put in der build-Methode. GetView — ein verkürztes StatelessWidget mit Controller-Zugriff über controller ohne Get.find.
Bekannte Einschränkungen: GetX verwendet globale Variablen (Get.find, Get.to), was das Testen erschweren kann. Das Mocken von Abhängigkeiten über GetX erfordert Get.replace() oder Get.reset() zwischen Tests. Zur Isolation wird Get.testMode = true empfohlen. GetX wird nicht für Anwendungen empfohlen, die eine strenge Architektur mit klaren Schichtgrenzen erfordern — in diesem Fall sind BLoC oder Riverpod mit Codegenerierung vorzuziehen.
Häufig gestellte Fragen
GetX — ein Mikro-Framework mit eigenem DI, Navigation und Rx-Reaktivität. Provider — nur Zustandsverwaltung über ChangeNotifier und InheritedWidget. GetX benötigt kein BuildContext, hat integrierte Navigation und DI und reduziert Boilerplate um 60-70%. Provider verwendet den standardmäßigen Flutter Navigator und benötigt Drittanbieterlösungen für DI. GetX ist schneller in der Entwicklung, Provider ist näher an der nativen Flutter-API.
Workers — Dienstprogramme zur reaktiven Verarbeitung von Änderungen an Rx-Variablen. ever — Callback bei jeder Änderung, once — nur bei der ersten Änderung, debounce — mit Verzögerung (für Suchfelder), interval — nicht öfter als N-mal (für Analytik). Workers werden in onInit() des GetxController deklariert und melden sich in onClose() automatisch ab. Dies ersetzt manuelles addListener/removeListener mit ChangeNotifier.
GetX bietet Get.testMode = true zum Aktivieren des Testmodus. Abhängigkeiten werden über Get.replace<Service>(mockService) ersetzt. Zwischen Tests wird Get.reset() aufgerufen, um den DI-Container zu leeren. Controller werden direkt ohne Flutter getestet: final c = CounterController(); c.increment(); expect(c.count.value, 1). Für Widgets mit Obx verwenden Sie tester.pumpWidget mit InjectMocker.
GetX ist für Projekte jeder Größe geeignet, erfordert jedoch Disziplin. Für große Projekte (10+ Bildschirme) verwenden Sie: Bindings zur Controller-Isolierung, Module (GetPages-Dateien pro Funktion), GetView statt manuellem Get.find in build. Das Hauptrisiko ist der Missbrauch des globalen Zugriffs (Get.find überall). Strenge Code-Reviews und Architekturrichtlinien lösen dieses Problem. Viele Produktionsanwendungen mit Millionen von Benutzern laufen auf GetX.
Bindings — eine Klasse, die eine Route mit ihren Abhängigkeiten verbindet. Beim Betreten eines Bildschirms erstellt Binding den Controller und Dienste über Get.lazyPut und entfernt sie beim Verlassen. Bindings implementieren verzögerte Initialisierung: Der Controller existiert nicht im Speicher, bis der Bildschirm geöffnet wird. Dies spart RAM und App-Startzeit. Werden in GetPage deklariert: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch