El autor está disponible para consultoría y trabajo por contratoAgenda una llamada →
Skip to content

Guía Rápida de Decisión ​

Necesitas...Usa este paquete
Acceder a servicios/dependencias desde cualquier parte de tu appget_it
Actualizar la UI automáticamente cuando los datos cambianwatch_it + get_it
Manejar acciones asíncronas con estados de carga/errorcommand_it
Transformar, combinar datos reactivos o usar colecciones observableslisten_it

¿Por qué estos paquetes? ​

Una buena arquitectura Flutter sigue principios clave: separación de responsabilidades, única fuente de verdad, y testabilidad. Los paquetes flutter_it te ayudan a implementar estos principios sin la complejidad de los frameworks tradicionales.

💡 ¿Nuevo en arquitectura Flutter? Salta a los principios de arquitectura detallados para entender la base.

Arquitectura flutter_it

Arquitectura flutter_it


Los Problemas que Resuelve Cada Paquete ​

get_itget_it - Accede a cualquier cosa, desde cualquier lugar ​

Problema: ¿Cómo accedo a servicios, lógica de negocio y datos compartidos sin pasarlos a través del árbol de widgets?

Solución: Patrón Service Locator - registra una vez, accede desde cualquier lugar sin BuildContext.

Úsalo cuando:

  • Necesites dependency injection sin el árbol de widgets
  • Quieras compartir servicios a través de tu app
  • Necesites control sobre el ciclo de vida de objetos (singletons, factories, scopes)
  • Quieras probar tu lógica de negocio de forma independiente

Caso de uso ejemplo: Acceder a un servicio de API desde cualquier parte de tu app.

Flujo de datos get_it

Comienza con get_it →


watch_itwatch_it - Actualizaciones de UI reactivas ​

Problema: ¿Cómo actualizo mi UI cuando los datos cambian sin setState() o gestión de estado compleja?

Solución: Observa ValueListenable/ChangeNotifier y reconstruye automáticamente - casi nunca necesitarás StatefulWidget otra vez.

Úsalo cuando:

  • Quieras actualizaciones automáticas de UI cuando cambien los datos
  • Quieras eliminar el boilerplate de StatefulWidget y setState()
  • Necesites reconstrucciones granulares (solo los widgets afectados)
  • Estés cansado de gestionar suscripciones manualmente

Caso de uso ejemplo: Un widget contador que se reconstruye cuando cambia el conteo.

Requiere: get_it para la localización de servicios

Flujo de datos watch_it

Comienza con watch_it →


command_itcommand_it - Encapsulación inteligente de acciones ​

Problema: ¿Cómo manejo operaciones asíncronas con estados de carga, errores y lógica de habilitación/deshabilitación sin boilerplate repetitivo?

Solución: Patrón Command con gestión de estado incluida - maneja excepciones de forma inteligente.

Úsalo cuando:

  • Tengas operaciones asíncronas (llamadas API, operaciones de base de datos)
  • Necesites indicadores de carga y manejo de errores
  • Quieras habilitar/deshabilitar acciones basándote en condiciones
  • Quieras lógica de acciones reutilizable y testeable

Caso de uso ejemplo: Un botón de guardar que muestra estado de carga, maneja errores y puede ser deshabilitado.

Flujo de datos command_it

Comienza con command_it →


listen_itlisten_it - Primitivas reactivas ​

Problema: ¿Cómo transformo, combino, filtro datos reactivos? ¿Cómo hago colecciones observables?

Solución: Operadores al estilo RxDart para ValueNotifier que son fáciles de entender, además de colecciones reactivas (ListNotifier, MapNotifier, SetNotifier).

Úsalo cuando:

  • Necesites transformar datos de ValueListenable (map, where, debounce)
  • Necesites combinar múltiples ValueListenables en uno
  • Quieras Listas, Maps o Sets observables que notifiquen los cambios
  • Necesites pipelines de datos reactivos sin la complejidad de RxDart

Caso de uso ejemplo: Aplicar debounce a una entrada de búsqueda, o un carrito de compras que notifica cambios en los items.

Flujo de datos listen_it

Comienza con listen_it →


Combinaciones Comunes de Paquetes ​

Configuración Mínima: get_it + watch_it ​

Perfecto para apps que necesitan dependency injection y UI reactiva. Cubre el 90% de las necesidades típicas de una app.

Ejemplo: La mayoría de apps CRUD, apps de dashboard, apps con muchos formularios.

Stack Completo: Los 4 paquetes ​

Arquitectura reactiva completa con dependency injection, UI reactiva, patrón Command y transformaciones de datos.

Ejemplo: Apps complejas con integración de API, actualizaciones en tiempo real y transformaciones de estado sofisticadas.

Casos de Uso Independientes ​

Cada paquete funciona de forma independiente:

  • Solo get_it: Dependency injection simple sin reactividad
  • Solo listen_it: Operadores/colecciones reactivas sin dependency injection
  • Solo command_it: Patrón Command para encapsular acciones

Principios de Arquitectura ​

¿Por qué separar tu código en capas? ​

Los paquetes flutter_it permiten arquitectura limpia resolviendo problemas específicos que surgen cuando separas responsabilidades:

El Objetivo: Mantener la lógica de negocio separada de la UI, mantener una única fuente de verdad, hacer todo testeable.

El Desafío: Una vez que mueves los datos fuera de los widgets, necesitas:

  1. Una forma de acceder a esos datos desde cualquier lugar → get_it resuelve esto
  2. Una forma de actualizar la UI cuando los datos cambian → watch_it resuelve esto
  3. Una forma de manejar operaciones asíncronas limpiamente → command_it resuelve esto
  4. Una forma de transformar y combinar datos reactivos → listen_it resuelve esto

Separación de responsabilidades ​

Diferentes partes de tu aplicación deberían tener diferentes responsabilidades:

  • Capa de UI: Muestra datos y maneja interacciones del usuario
  • Capa de lógica de negocio: Procesa datos e implementa reglas de la app
  • Capa de servicios: Se comunica con sistemas externos (APIs, bases de datos, características del dispositivo)

Al separar estas capas, puedes:

  • Cambiar una parte sin afectar las otras
  • Probar lógica de negocio sin UI
  • Reutilizar lógica a través de diferentes pantallas

Única fuente de verdad ​

Cada pieza de datos debería vivir exactamente en un lugar. Si tienes una lista de usuarios, debería haber una lista, no múltiples copias a través de diferentes widgets.

Beneficios:

  • Los datos se mantienen consistentes a través de tu app
  • Las actualizaciones ocurren en un solo lugar
  • Más fácil de depurar y mantener

Testabilidad ​

Tu app debería estar diseñada para facilitar las pruebas:

  • La lógica de negocio puede probarse sin widgets Flutter
  • Los servicios pueden simularse (mock) para pruebas unitarias
  • La UI puede probarse independientemente con datos de prueba

Para una discusión comprehensiva, mira Practical Flutter Architecture.


Siguientes Pasos ​

¿Listo para comenzar? Elige tu primer paquete:

¿Aún no estás seguro? Revisa ejemplos del mundo real para ver los paquetes en acción.

Publicado bajo la Licencia MIT. Creado por Thomas Burkhart.