GetX : concepts clés, navigation et DI dans Flutter

Auteur : IT Sectr Publié le : 2026-02-19 Temps de lecture : 7 min

GetX — un micro-framework léger pour Flutter qui combine la gestion d'état, la navigation et l'injection de dépendances dans un seul package. Développé par Amir Hossein Abdorashidi, GetX offre un boilerplate minimal : sans Stream, sans ChangeNotifier, sans BuildContext pour la navigation. Selon pub.dev, GetX a accumulé plus de 13 000 likes, devenant l'un des packages Flutter les plus populaires.

Points clés

  • Obx — widget réactif qui se reconstruit lorsqu'une variable Rx change
  • GetController — classe de logique métier avec méthodes et variables Rx
  • Get.to — navigation sans BuildContext via des routes nommées
  • Get.put / Get.find — injection et récupération de dépendances via le conteneur DI
  • Variables Rx — wrappers réactifs (RxInt, RxString, RxBool) avec notification automatique

Qu'est-ce que GetX ?

GetX — un micro-framework tout-en-un pour Flutter qui résout trois tâches principales de développement : la gestion d'état, la navigation (routage) et l'injection de dépendances (DI). GetX ne nécessite ni Stream, ni ChangeNotifier, ni Builders, ni abonnements — toute la réactivité est fournie par des wrappers Rx basés sur GetValue et GetStream, qui fonctionnent des dizaines de fois plus vite que ChangeNotifier.

GetX se positionne comme une alternative à la combinaison Provider + Navigator + get_it/kiwi. Au lieu d'installer trois packages différents et d'écrire 10 lignes de configuration, GetX fournit tout prêt à l'emploi avec une seule ligne : GetMaterialApp au lieu de MaterialApp. La navigation fonctionne via Get.to(NextScreen()) sans BuildContext, et la DI via Get.put(Service()) sans arborescence Provider.

Selon l'Enquête de la Communauté Flutter 2025, GetX est utilisé dans 43 % des projets Flutter. Les principales raisons de son choix : seuil d'entrée minimal (5 minutes pour apprendre), pas de boilerplate (code réduit de 60 à 70 % par rapport à Provider ou BLoC) et développement rapide de MVP. Les critiques notent la violation du principe de séparation des responsabilités et la complexité du débogage.

État réactif : Obx et Rx

Obx — un widget réactif GetX qui se reconstruit lorsque les variables Rx changent. Obx ne nécessite ni abonnement, ni dispose, ni fonctions Builder — il suffit d'envelopper le widget dans Obx et d'utiliser une variable Rx à l'intérieur. Obx suit automatiquement les variables Rx utilisées et ne se redessine que lorsqu'elles changent.

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}'));
}

Variables Rx : .obs — un getter qui enveloppe toute valeur dans un objet Rx. GetX fournit des classes Rx typées : RxInt, RxString, RxDouble, RxBool, RxList, RxMap. Toutes les variables Rx se comportent comme des primitives normales : count++, name.value = 'Hello', items.add(item). Le changement notifie automatiquement les abonnés Obx.

GetBuilder — une alternative à Obx sans Rx, fonctionnant via un appel manuel à update(). GetBuilder.filter — pour des mises à jour ciblées par clés ID. Obx est plus rapide (suivi automatique des dépendances), GetBuilder est plus prévisible (appel de mise à jour explicite). Obx est recommandé pour les scénarios simples et GetBuilder pour les widgets complexes avec de nombreuses dépendances.

GetController et cycle de vie

GetxController — une classe de base pour la logique métier avec support du cycle de vie. GetxController a des méthodes : onInit() (initialisation), onReady() (après la première image), onClose() (nettoyage des ressources). Contrairement à ChangeNotifier et StateNotifier, GetxController gère automatiquement les abonnements : lorsque la page est détruite, toutes les variables Rx et Workers sont désabonnés.

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 — utilitaires réactifs GetX : ever (appelé à chaque changement), once (uniquement au premier changement), debounce (avec délai), interval (pas plus de N fois par seconde). Les Workers résolvent des tâches courantes : validation de champ (debounce), analytique (once), synchronisation (ever). Les Workers se désabonnent automatiquement lorsque onClose() est appelé, évitant les fuites mémoire.

La navigation GetX ne nécessite pas de BuildContext pour passer d'un écran à l'autre. Au lieu de Navigator.push(context, MaterialPageRoute(...)), on utilise Get.to(NextScreen()) — appelable depuis n'importe où, y compris un Controller sans accès à BuildContext. GetX prend en charge les routes nommées, les animations, le middleware et le passage d'arguments sans MaterialPageRoute.

Dart
// Navigation standard
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // remplacer la route actuelle
Get.offAll(HomeScreen()); // vider la pile

// Routes nommées
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');

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

GetPage et GetPages : GetX utilise GetPages au lieu de routes dans MaterialApp. Middleware — vérifications d'authentification, redirections, analytique avant d'entrer sur un écran. Transition — animations de transition intégrées : fadeIn, zoom, leftToRight, topToBottom. Bindings — une classe qui initialise le Controller et les dépendances lors de l'entrée sur une route. Les Bindings résolvent le problème d'initialisation paresseuse : le Controller n'est créé que lorsque l'écran est ouvert.

Injection de dépendances avec GetX

Get.put — enregistre une instance dans le conteneur DI. Get.find — récupère une instance du conteneur. Get.lazyPut — initialisation paresseuse (créé au premier appel find). Get.putAsync — initialisation asynchrone (pour les services avec init). Get.delete — supprime du conteneur (appelé automatiquement par Bindings à la destruction de la route).

MéthodeQuand est crééQuand est supprimé
Get.putImmédiatementGet.delete ou onClose
Get.lazyPutAu premier findGet.delete ou onClose
Get.putAsyncAprès l'achèvement de FutureGet.delete ou onClose
Get.createÀ chaque find (nouvelle fabrique)Non

DI de GetX — le conteneur DI le plus simple dans Flutter. Pas d'arborescence Provider, pas de Module, pas de Scope. Get.put(Repository()) dans le Controller ou main.dart rend l'objet accessible partout dans l'application via Get.find<Repository>(). Le DI de GetX prend également en charge le marquage (tag: 'api') et la permanence (permanent: true) pour empêcher la suppression.

GetX : meilleures pratiques et performances

Les performances de GetX sont basées sur des wrappers Rx qui fonctionnent via GetStream — une implémentation Stream personnalisée optimisée pour Flutter. Selon les benchmarks de GetX, les variables Rx sont 2 à 3 fois plus rapides que ChangeNotifier et 5 à 7 fois plus rapides que BLoC avec des mises à jour fréquentes (30+ fps). GetX n'utilise pas BuildContext pour les abonnements, ce qui élimine la reconstruction de l'arborescence des widgets lors de la navigation.

Meilleures pratiques : utilisez GetBuilder au lieu d'Obx pour les widgets avec de nombreux éléments enfants (listes, tableaux). Divisez le Controller par modules fonctionnels plutôt qu'un énorme Controller par page. Utilisez Bindings pour l'initialisation du Controller, pas Get.put dans la méthode build. GetView — un StatelessWidget raccourci avec accès au Controller via controller sans Get.find.

Limitations connues : GetX utilise des variables globales (Get.find, Get.to), ce qui peut compliquer les tests. Le moquage des dépendances via GetX nécessite Get.replace() ou Get.reset() entre les tests. Pour l'isolation, Get.testMode = true est recommandé. GetX n'est pas recommandé pour les applications nécessitant une architecture stricte avec des limites de couches claires — dans ce cas, BLoC ou Riverpod avec génération de code est préférable.

Questions fréquentes

En quoi GetX diffère-t-il de Provider ?

GetX — un micro-framework avec son propre DI, sa navigation et sa réactivité Rx. Provider — seulement la gestion d'état via ChangeNotifier et InheritedWidget. GetX ne nécessite pas BuildContext, dispose d'une navigation et d'un DI intégrés, réduisant le boilerplate de 60 à 70 %. Provider utilise le Navigator standard de Flutter et nécessite des solutions tierces pour le DI. GetX est plus rapide en développement, Provider est plus proche de l'API native de Flutter.

Que sont les Workers GetX ?

Workers — des utilitaires pour le traitement réactif des changements de variables Rx. ever — callback à chaque changement, once — seulement au premier changement, debounce — avec délai (pour les champs de recherche), interval — pas plus de N fois (pour les analytiques). Les Workers sont déclarés dans onInit() du GetxController et se désabonnent automatiquement dans onClose(). Cela remplace addListener/removeListener manuel avec ChangeNotifier.

Comment tester GetX ?

GetX fournit Get.testMode = true pour activer le mode test. Les dépendances sont remplacées via Get.replace<Service>(mockService). Entre les tests, Get.reset() est appelé pour vider le conteneur DI. Les Controllers sont testés directement sans Flutter : final c = CounterController(); c.increment(); expect(c.count.value, 1). Pour les widgets avec Obx, utilisez tester.pumpWidget avec InjectMocker.

Dois-je utiliser GetX pour les grands projets ?

GetX convient aux projets de toute taille mais nécessite de la discipline. Pour les grands projets (10+ écrans), utilisez : Bindings pour l'isolation du Controller, des modules (fichiers GetPages par fonctionnalité), GetView au lieu de Get.find manuel dans build. Le risque principal est l'abus de l'accès global (Get.find n'importe où). Des revues de code strictes et des directives architecturales résolvent ce problème. De nombreuses applications de production avec des millions d'utilisateurs fonctionnent sur GetX.

Que sont les Bindings GetX ?

Bindings — une classe qui connecte une route avec ses dépendances. Lors de l'entrée sur un écran, Binding crée le Controller et les services via Get.lazyPut, et les supprime à la sortie. Les Bindings implémentent l'initialisation paresseuse : le Controller n'existe pas en mémoire jusqu'à ce que l'écran soit ouvert. Cela économise la RAM et le temps de démarrage de l'application. Déclarés dans GetPage : GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding()).

Résumé

  • GetX — micro-framework Flutter avec gestion d'état, navigation et DI dans un seul package
  • Obx et Rx — wrappers réactifs avec redessin automatique sans Stream ni ChangeNotifier
  • GetxController — classe de logique métier avec cycle de vie onInit/onReady/onClose
  • Get.to / Get.back — navigation sans BuildContext avec animations intégrées
  • Get.put / Get.find — conteneur DI sans arborescence Provider avec initialisation paresseuse
  • Workers — ever, once, debounce, interval pour le traitement réactif des changements
  • Bindings — initialisation paresseuse du Controller à l'ouverture d'une route avec autodestruction

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi