GetX: nyckelbegrepp, navigering och DI i Flutter

Författare: IT Sectr Publicerad: 2026-02-19 Lästid: 7 min

GetX — ett lättviktigt mikro-ramverk för Flutter som kombinerar state management, navigering och dependency injection i ett paket. Utvecklat av Amir Hossein Abdorashidi, erbjuder GetX minimal boilerplate: utan Stream, utan ChangeNotifier, utan BuildContext för navigering. Enligt data från pub.dev har GetX samlat över 13 tusen likes och blivit ett av de mest populära Flutter-paketen.

Huvudpunkter

  • Obx — reaktiv widget som bygger om när en Rx-variabel ändras
  • GetController — klass för affärslogik med metoder och Rx-variabler
  • Get.to — navigering utan BuildContext via namngivna rutter
  • Get.put / Get.find — injicering och hämtning av beroenden via DI-container
  • Rx-variabler — reaktiva omslag (RxInt, RxString, RxBool) med automatisk notifiering

Vad är GetX?

GetX — ett allt-i-ett mikro-ramverk för Flutter som löser tre huvudsakliga utvecklingsuppgifter: state management (State Management), navigering (Routing) och dependency injection (DI). GetX kräver inte Stream, ChangeNotifier, Builders eller prenumerationer — all reaktivitet tillhandahålls av Rx-omslag baserade på GetValue och GetStream, som arbetar tiotals gånger snabbare än ChangeNotifier.

GetX positionerar sig som ett alternativ till kombinationen Provider + Navigator + get_it/kiwi. Istället för att installera tre olika paket och skriva 10 rader konfiguration, ger GetX allt i ett paket med en rad: GetMaterialApp istället för MaterialApp. Navigering fungerar via Get.to(NextScreen()) utan BuildContext, och DI — via Get.put(Service()) utan Provider-träd.

Enligt Flutter Community Survey 2025 används GetX i 43% av Flutter-projekten. Huvudskäl till valet: minimal inträdesbarriär (5 minuter att lära sig), ingen boilerplate (koden blir 60–70% kortare jämfört med Provider eller BLoC) och snabb MVP-utveckling. Kritiker påpekar brott mot principen om separation av ansvar och svårigheter med felsökning.

Reaktivt tillstånd: Obx och Rx

Obx — GetX reaktiva widget som bygger om när Rx-variabler ändras. Obx kräver ingen prenumeration, dispose eller Builder-funktioner — det räcker att slå in widgeten i Obx och använda en Rx-variabel inuti. Obx spårar automatiskt vilka Rx-variabler som används och ritar bara om när de ändras.

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-variabler: .obs — getter som slår in valfritt värde i ett Rx-objekt. GetX tillhandahåller typade Rx-klasser: RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Alla Rx-variabler beter sig som vanliga primitiver: count++, name.value = 'Hello', items.add(item). Ändring notifierar automatiskt Obx-prenumeranter.

GetBuilder — alternativ till Obx utan Rx, som fungerar genom manuellt anrop av update(). GetBuilder.filter — för punktvis uppdatering efter ID-nycklar. Obx är snabbare (automatisk beroendeövervakning), GetBuilder är mer förutsägbar (explicit uppdateringsanrop). Obx rekommenderas för enkla scenarier och GetBuilder för komplexa widgetar med många beroenden.

GetController och livscykel

GetxController — basklass för affärslogik med stöd för livscykel. GetxController har metoder: onInit() (initialisering), onReady() (efter första bildrutan), onClose() (rensning av resurser). Till skillnad från ChangeNotifier och StateNotifier hanterar GetxController automatiskt prenumerationer: när sidan förstörs avprenumereras alla Rx-variabler och 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 — reaktiva verktyg i GetX: ever (anropas vid varje ändring), once (endast vid första ändringen), debounce (med fördröjning), interval (högst N gånger per sekund). Workers löser typiska uppgifter: fältvalidering (debounce), analys (once), synkronisering (ever). Workers avprenumereras automatiskt vid anrop av onClose(), vilket förhindrar minnesläckor.

GetX-navigering kräver inte BuildContext för övergång mellan skärmar. Istället för Navigator.push(context, MaterialPageRoute(...)) används Get.to(NextScreen()) — anrop från var som helst, inklusive Controller utan åtkomst till BuildContext. GetX stöder namngivna rutter, animationer, middleware och argumentöverföring utan MaterialPageRoute.

Dart
// Vanlig navigering
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // ersätt aktuell rutt
Get.offAll(HomeScreen()); // rensa stacken

// Namngivna rutter
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

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

GetPage och GetPages: GetX använder GetPages istället för routes i MaterialApp. Middleware — auktorisationskontroll, omdirigeringar, analys innan inträde på skärmen. Transition — inbyggda övergångsanimationer: fadeIn, zoom, leftToRight, topToBottom. Bindings — klass som initierar Controller och beroenden vid inträde på rutten. Bindings löser problemet med lat initialisering: Controller skapas bara när skärmen är öppen.

Dependency Injection med GetX

Get.put — registrering av instans i DI-container. Get.find — hämtning av instans från containern. Get.lazyPut — lat initialisering (skapas vid första find-anropet). Get.putAsync — asynkron initialisering (för tjänster med init). Get.delete — borttagning från containern (anropas automatiskt av Bindings vid förstöring av rutten).

MetodNär skapasNär tas bort
Get.putOmedelbartGet.delete eller onClose
Get.lazyPutVid första findGet.delete eller onClose
Get.putAsyncEfter att Future har körtsGet.delete eller onClose
Get.createVid varje find (ny fabrik)Nej

GetX DI — den enklaste DI-containern i Flutter. Inget Provider-träd, ingen Module, inget Scope. Get.put(Repository()) i Controller eller main.dart gör objektet tillgängligt var som helst i applikationen via Get.find<Repository>(). GetX DI stöder även taggning (tag: 'api') och permanens (permanent: true) för att förhindra borttagning.

GetX: best practices och prestanda

Prestanda i GetX baseras på Rx-omslag som fungerar via GetStream — en egen Stream-implementation optimerad för Flutter. Enligt GetX-riktmärken är Rx-variabler 2–3 gånger snabbare än ChangeNotifier och 5–7 gånger snabbare än BLoC vid frekventa uppdateringar (30+ fps). GetX använder inte BuildContext för prenumerationer, vilket eliminerar ombyggnad av widget-trädet vid navigering.

Best practices: använd GetBuilder istället för Obx för widgetar med många underordnade element (listor, tabeller). Dela upp Controllers efter funktionella moduler, inte en enorm Controller per sida. Använd Bindings för initialisering av Controller, inte Get.put i build-metoden. GetView — en förkortad StatelessWidget med åtkomst till Controller via controller utan Get.find.

Kända begränsningar: GetX använder globala variabler (Get.find, Get.to), vilket kan försvåra testning. Mockning av beroenden via GetX kräver Get.replace() eller Get.reset() mellan tester. För isolering rekommenderas Get.testMode = true. GetX rekommenderas inte för applikationer som kräver strikt arkitektur med tydliga lager-gränser — i sådana fall är BLoC eller Riverpod med kodgenerering att föredra.

Vanliga frågor

Vad skiljer GetX från Provider?

GetX — mikro-ramverk med egen DI, navigering och Rx-reaktivitet. Provider — endast state management via ChangeNotifier och InheritedWidget. GetX kräver inte BuildContext, har inbyggd navigering och DI, minskar boilerplate med 60–70%. Provider använder standard Flutter Navigator och kräver tredjepartslösningar för DI. GetX är snabbare i utveckling, Provider — närmare inbyggt Flutter API.

Vad är GetX Workers?

Workers — verktyg för reaktiv bearbetning av ändringar i Rx-variabler. ever — callback vid varje ändring, once — endast vid första, debounce — med fördröjning (för sökfält), interval — högst N gånger (för analys). Workers deklareras i onInit() av GetxController och avprenumereras automatiskt i onClose(). Detta ersätter manuell addListener/removeListener med ChangeNotifier.

Hur testar man GetX?

GetX tillhandahåller Get.testMode = true för att aktivera testläge. Beroenden ersätts via Get.replace<Service>(mockService). Mellan tester anropas Get.reset() för att rensa DI-containern. Controllers testas direkt utan Flutter: final c = CounterController(); c.increment(); expect(c.count.value, 1). För widgetar med Obx, använd tester.pumpWidget med InjectMocker.

Är det värt att använda GetX för stora projekt?

GetX passar för projekt av alla storlekar, men kräver disciplin. För stora projekt (10+ skärmar) använd: Bindings för isolering av Controllers, moduler (GetPages-filer per funktionalitet), GetView istället för manuell Get.find i build. Huvudrisken — missbruk av global åtkomst (Get.find överallt). Strikta code reviews och arkitekturriktlinjer löser detta problem. Många produktionsapplikationer med miljontals användare kör på GetX.

Vad är GetX Bindings?

Bindings — klass som kopplar rutten till dess beroenden. Vid inträde på skärmen skapar Binding Controller och tjänster via Get.lazyPut, vid utträde tar de bort dem. Bindings implementerar lat initialisering: Controller finns inte i minnet förrän skärmen är öppen. Detta sparar RAM och applikationens starttid. Deklareras i GetPage: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Sammanfattning

  • GetX — Flutter mikro-ramverk med state management, navigering och DI i ett paket
  • Obx och Rx — reaktiva omslag med automatisk omritning utan Stream och ChangeNotifier
  • GetxController — klass för affärslogik med livscykel onInit/onReady/onClose
  • Get.to / Get.back — navigering utan BuildContext med inbyggda animationer
  • Get.put / Get.find — DI-container utan Provider-träd med lat initialisering
  • Workers — ever, once, debounce, interval för reaktiv bearbetning av ändringar
  • Bindings — lat initialisering av Controller vid öppning av rutt med automatisk disponering

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också