/android-architecture-flow

Este repositorio contiene 2 proyectos: storageApp y networkApp. Presenta variaciones de arquitectura basadas en el núcleo de Flow, incluyendo variantes como "Unidirectional Data Flow" y "Jetpack Compose con Navigation Compose".

Primary LanguageKotlin

Arquitectura Android basado en Flow

forthebadgeforthebadge

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.


Proyecto Base

1. StorageApp:

StorageApp: Construido con arquitectura Clean, patron MVVM, Android Jetpack (room, navigation, lifecycle, livedata), Coroutines (Flow) y algunas librerias (koin, timber, junit, mockito).

2. NetworkApp:

NetworkApp: Construido con arquitectura Clean, patron MVVM, Android Jetpack (navigation, lifecycle, livedata, SharedPreferences), Coroutines (Flow) y algunas librerias ( retrofit, timber).

Configuración de backendless, necesario para correr NetworkApp:

  1. Crear una nueva cuenta en backendless.
  2. Configurar de acuerdo al siguiente video: Tutorial.

Credenciales de inicio de sesión

Usuario: admin@admin.com Password: 12345admin

Diagrama de Arquitectura:

About screen

Usos de FLow:

  • 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.

Variante: Unidirectional data flow

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)

Diagrama de Arquitectura:

About screen

Variante: Jetpack Compose

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

Diagrama de Arquitectura:

About screen

Diapositivas

Puedes encontrar las diapositivas en el siguiente enlace.

Créditos

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.