GetX: Schlüsselkonzepte, Navigation und DI in Flutter

Autor: IT Sectr Veröffentlicht: 2026-02-19 Lesezeit: 7 Min.

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

  • Obx — reaktives Widget, das sich bei Änderung einer Rx-Variable neu aufbaut
  • GetController — Geschäftslogik-Klasse mit Methoden und Rx-Variablen
  • Get.to — Navigation ohne BuildContext über benannte Routen
  • Get.put / Get.find — Dependency Injection und Abruf über DI-Container
  • Rx-Variablen — reaktive Wrapper (RxInt, RxString, RxBool) mit automatischer Benachrichtigung

Was ist GetX?

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.

Reaktiver Zustand: Obx und Rx

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.

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-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.

GetController und Lebenszyklus

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.

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 — 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.

Dart
// 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.

Dependency Injection mit GetX

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).

MethodeWann erstelltWann entfernt
Get.putSofortGet.delete oder onClose
Get.lazyPutBeim ersten findGet.delete oder onClose
Get.putAsyncNach Future-AbschlussGet.delete oder onClose
Get.createBei 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: Best Practices und Leistung

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

Wie unterscheidet sich GetX von Provider?

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.

Was sind GetX Workers?

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.

Wie testet man GetX?

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.

Sollte ich GetX für große Projekte verwenden?

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.

Was sind GetX Bindings?

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

  • GetX — Flutter-Mikro-Framework mit Zustandsverwaltung, Navigation und DI in einem Paket
  • Obx und Rx — reaktive Wrapper mit automatischer Neuzeichnung ohne Stream und ChangeNotifier
  • GetxController — Geschäftslogik-Klasse mit onInit/onReady/onClose-Lebenszyklus
  • Get.to / Get.back — Navigation ohne BuildContext mit integrierten Animationen
  • Get.put / Get.find — DI-Container ohne Provider-Baum mit verzögerter Initialisierung
  • Workers — ever, once, debounce, interval zur reaktiven Verarbeitung von Änderungen
  • Bindings — verzögerte Controller-Initialisierung beim Öffnen einer Route mit automatischer Freigabe

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.

Projekt besprechen

Lesen Sie auch