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
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.
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.
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.
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.
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.
// 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.
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).
| Metod | När skapas | När tas bort |
|---|---|---|
| Get.put | Omedelbart | Get.delete eller onClose |
| Get.lazyPut | Vid första find | Get.delete eller onClose |
| Get.putAsync | Efter att Future har körts | Get.delete eller onClose |
| Get.create | Vid 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.
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
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.
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.
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.
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.
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
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.
Läs också