GetX en Flutter: ejercicio resuelto de gestión de estado
GetX en Flutter: ejercicio resuelto de gestión de estado
GetX es una solución todo-en-uno: gestión de estado reactiva, inyección de dependencias y navegación sin BuildContext. Su ventaja principal es la velocidad de desarrollo — un controlador observable reconstruye solo los widgets suscritos, sin Provider, sin StreamBuilder, sin context.watch.
Enunciado
Implementa una app de carrito de compras con GetX donde:
- El catálogo de productos carga desde un repositorio falso (simula llamada API).
- El carrito usa un
GetxControllercon lista reactiva. - Un badge en el
AppBarmuestra el número de ítems en tiempo real. - La pantalla de carrito lista los productos con cantidad y total.
Dependencias
Solución completa
Cómo funciona internamente
| Concepto | Descripción |
|---|---|
GetxController | Clase base para controladores con ciclo de vida (onInit, onClose) |
.obs | Convierte cualquier variable en observable (RxList, RxBool, RxString…) |
Obx(() => ...) | Se suscribe automáticamente a los observables usados dentro del builder |
Get.put(T) | Inyecta y registra una instancia en el contenedor de GetX |
Get.find<T>() | Recupera la instancia registrada desde cualquier parte del código |
GetMaterialApp | Reemplaza MaterialApp para activar navegación y snackbars sin contexto |
Bindings (inicialización diferida)
Los Binding agrupan las dependencias de cada ruta y las destruyen al salir.
Errores frecuentes
Get.find<T>()sin registrar: lanza"CatalogController" not found. UsaGet.putoGet.lazyPutantes de llamar aGet.find.Obxsin observables dentro: GetX avisa en consola que el widget no se suscribió a ningún observable. Comprueba que accedes a.valueo usas propiedades.obs.GetMaterialAppolvidado: sin él,Get.snackbary la navegación sin contexto no funcionan.
Aplicación práctica
GetX es popular en apps donde la velocidad de desarrollo importa más que la arquitectura estricta: prototipos, apps medianas, equipos pequeños. Para proyectos grandes con test unitario extenso, BLoC o Riverpod ofrecen mejor separación de responsabilidades.
Siguiente ejercicio recomendado
- BLoC con Cubit en Flutter: ejercicio resuelto
- Inyección de dependencias con get_it en Flutter: ejercicio resuelto
- Riverpod en Flutter: ejercicio resuelto con contador
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
FAQ
¿GetX reemplaza completamente a Provider o Riverpod?
Sí, en funcionalidad lo cubre todo: estado, DI y navegación. Pero sacrifica testabilidad: los controladores con Get.find global son difíciles de aislar en tests unitarios. Provider y Riverpod son más seguros para proyectos grandes.
¿Qué diferencia hay entre Obx y GetX?
Obx(() => ...) es el builder reactivo simple. GetX<Controller>(builder: ...) accede al controlador directamente desde el builder, útil si necesitas llamar métodos del controlador dentro del widget sin Get.find.
¿Puedo usar GetX solo para inyección de dependencias sin la navegación?
Sí. Puedes mantener MaterialApp normal y usar únicamente Get.put/Get.find para DI, sin GetMaterialApp. Así combinas GetX con tu sistema de rutas existente (go_router, etc.).