Este repositorio contiene 2 proyectos. El primero utiliza una base de datos como fuente de datos (storageApp), mientras que el segundo utiliza conexiones a servicios web y preferencias como fuente de datos (networkApp).
A lo largo del respositorio se presentan diversas variaciones en la arquitectura del proyecto base, manteniendo el núcleo de la arquitectura con la biblioteca Flow. Las siguientes son las variaciones disponibles:
- Unidirectional data flow: Esta implementación representa una combinación intermedia entre MVVM y MVI.
- Compose: Utiliza Jetpack Compose y Navigation Compose para la capa de presentación.
Aquí hay una muestra del proyecto base (networkApp) utilizando Compose: Video.
StorageApp: Construido con arquitectura Clean, patron MVVM, Android Jetpack (room, navigation, lifecycle, livedata), Coroutines (Flow) y algunas librerias (koin, timber, junit, mockito).
NetworkApp: Construido con arquitectura Clean, patron MVVM, Android Jetpack (navigation, lifecycle, livedata, SharedPreferences), Coroutines (Flow) y algunas librerias ( retrofit, timber).
- Crear una nueva cuenta en backendless.
- Configurar de acuerdo al siguiente video: Tutorial.
Usuario: admin@admin.com Password: 12345admin
- Permite transmitir informacion entre las diferentes capas de Clean. Desde la capa de Data -> Domain -> Presentation.
- Permite recibir notificaciones de cambios en su base de datos usando "Lecturas observables" a traves de Flow y Room(version 2.2 o superior).
- Permite que cualquier View observe cambios en datos relevantes en el ViewModel y actualice la UI, a traves de StateFlow.
StorageApp: Implementacion intermedia entre MVVM y MVI, utilizando ViewState y Event en el ViewModel, tambien se utilizo StateFlow en vez de LiveData. También se uso la libreria Turbine para Unit Test.
ViewState: Clase que almacena el estado actual de su vista. Lo emites a traves de un LiveData o State Flow (state).
Representado por:
- Data Class
- Sealed Class
Event: Los eventos son acciones que desencadena la UI.
Representado por:
- Sealed Class
StateFlow: Flujo observable contenedor de estados que emite actualizaciones de estados actuales y nuevas a sus recopiladores.
Descripción | LiveData | StateFlow |
---|---|---|
Contenedor de datos observables | YES | YES |
Patron de diseño: OBSERVER | YES | YES |
Requiere estado inicial en el constructor | NO | YES |
Dar de baja al consumidor cuando la View pasa a STOPPED | AUTOMATIC | MANUAL (lifecycle.repeatOnLifecycle) |
StorageApp: Implementacion cambiando la capa de presentacion con la libreria Jeckpack Compose y Navigation Compose.
Jetpack Compose: Se ha vuelto más fácil crear UI en tiempo de ejecución en lugar de definir una UI estática que pueda rellenarse con datos. En la mayoría de los casos optimizas el tiempo de desarrollo y la facilidad de mantener código.
- El radar de thoughtworks sugiere adoptarlo desde 2021 (Martin Fowler - Chief Scientist).
- Tendencia en el mercado construir Interfaces Declarativas (SwiftUI, Flutter, React).
NetworkApp: Implementacion cambiando la capa de presentacion con la libreria Jeckpack Compose y Navigation Compose.
Para configurar el proyecto NetworkApp revisar los siguientes puntos al inicio del README:
- Configuración de backendless, necesario para correr la app de prueba.
- Credenciales de inicio de sesión
Puedes encontrar las diapositivas en el siguiente enlace.
Este repositorio es posible gracias a Eduardo Medina de hecho el repositorio esta basado en uno de sus proyectos base y Jhonatan Sandoval por la guia de la arquitectura basada en flows.