Aplicaciones móviles nativas
- 1 Introducción
- 2 Requisitos
- 3 Estructura del proyecto
- 3.1 Shared
- 3.1.1 Presentation
- 3.1.1.1 UI
- 3.1.1.2 Navegation
- 3.1.2 Domain
- 3.1.2.1 Model
- 3.1.2.2 Repository
- 3.1.2.3 UseCase
- 3.1.3 Data
- 3.1.3.1 Model
- 3.1.3.2 Repository
- 3.1.1 Presentation
- 3.2 AndroidApp
- 3.3 IOSApp
- 3.1 Shared
Introducción
Onesait Platform cuenta con un proyecto de aplicación multiplataforma desarrollada mediante Kotlin Multiplatform, lo que permite contar con interfaces de usuario nativas para las plataformas de Android (con Jetpack Compose) e iOS (SwiftUI).
Requisitos
Para trabajar con el código compartido de Kotlin, se requiere:
IDE: adaptado a Kotlin, como puede ser Android Studio Narwhal o IntelliJ IDEA (requiere licencia).
Plugin KMM: que es una extensión de Kotlin Multiplatform Mobile.
Desarrollos en Android
Es necesario contar, dentro del IDE que se utilice, el emulador de Android (o utilizar un dispositivo físico).
Desarrollos en iOS
En el caso de iOS, se requiere:
Un ordenador con MacOS.
Como IDE, hay que utilizar Xcode.
En Xcode, se tiene que tener el emulador de iOS, o utilizar un dispositivo físico.
Estructura del proyecto
El proyecto se organiza en diferentes carpetas, cada una de las cuales presenta diferentes funcionalidades.
Shared
Este módulo contiene la lógica de negocio y de acceso a datos que se comparte entre las plataformas de iOS y Android.
Se separan las responsabilidades en tres capas principales:
Presentación.
Dominio.
Datos.
Presentation
El código aquí contenido es el que se ocupa de la lógica de la interzar de usuario (UI).
UI
Contiene los «ViewModel» de cada pantalla. Están conformados por:
UIState:que gestiona y expone el estado que la UI debe dibujar.
ViewModelActions: es una interface donde se definen las funciones que se tienen que procesar en cada
ViewModely la navegación (otra interface) con el contrato de navegación.
Navegation
Define los contratos de navegación a través de interfaces.
El ViewModel utiliza estas interfaces para solicitar un cambio de pantalla, pero la implementación real de la navegación se realiza en la capa nativa de cada plataforma.
Domain
Contiene las reglas de negocio, pero es independiente de la UI y la fuente de datos.
El fichero «DomainConfiguration» es donde se registra las implementaciones concretas de los casos de uso en sus interfaces a través del sistema de inyección de dependencias (Locator). Esto permite el desacoplamiento entre las capas.
El fichero «DataConstants» tiene las constantes globales que se utilizan en toda la aplicación con puede ser los endpoints al servidor.
Model
Se encontrarán las entidades de negocio limpios e independientes al servidor, con los que trabaja la aplicación.
Los ficheros que finalizan en UIState son los estados que utiliza la UI que se implementan en los ViewModel.
Repository
Se definen los contratos (interface) de los repositorios, normalmente contiene funciones «suspend» ya que serán llamadas a servidores u otros servicios pesados y tendrán que ejecutarse en segundo plano. Estas funciones dicen qué datos necesita, pero no le importa cómo o de dónde se obtienen.
UseCase
Cada caso de uso representa una única acción cumpliendo un objetivo específico obtenido de un repositorio.
Data
Representa la implementación concreta de la obtención (almacenamiento) de los datos.
El fichero «DataConfiguration» es donde se registra las implementaciones concretas de los repositorios para sus interfaces a través del sistema de inyección de dependencias (Locator).
Model
Contiene los DTOs, son los modelos que se obtienen del servidor. Esos modelos no deben de salir de esta capa y se deben de mapear en los modelos limpios de la capa de dominio.
Repository
Implementa las interfaces definidas en la capa de dominio. Se obtienen los datos correspondientes del servidor.
AndroidApp
Es el módulo de la aplicación en Android. Se define la UI nativa en Jetpack Compose y se conecta dicha UI con la lógica compartida definida en el módulo ‘shared’.
UI
Contiene los componentes visuales y la estructura de principal de la aplicación.
El fichero MainActivity.kt es el punto de entrada de la aplicación donde se configura el sistema de inyección de dependencias (Locator) registrando las implementaciones específicas de Android como la navegación y los servicios. También se define el punto de entrada de la UI, la primera pantalla que se va a mostrar al iniciar la aplicación.
Controls
Contiene los Composables de UI genéricos y reutilizables como los diálogos para mantener un diseño consistente y reducir la duplicación de código.
Features
Contiene cada pantalla de la aplicación. En cada una se obtiene su instancia de su ViewModel correspondiente del módulo de ‘shared’. Se observan los cambios de estado (UIState) expuestos por el ViewModel.
En cada UI utiliza se reutiliza un contendedor BaseScreen, que gestiona la lógica común a todas las pantallas, como mostrar diálogos o la carga.
Theme
Se define la apariencia visual global de la aplicación. Donde se encuentra Colors, con la paleta de colores de la aplicación, y Typography, con las fuentes personalizadas.
Navigation
Implementa los contratos de navegación definidos en la capa de Presentation del módulo de ‘shared’. Su responsabilidad es ejecutar las acciones específicas de Android.
Services
Contiene las implementaciones concretas de los servicios que son específicos de la plataforma Android.
IOSApp
Es el módulo que contiene el código especifico de la plataforma iOS. Su responsabilidad es construir la UI nativa y servir de puente entre la lógica compartida del módulo ‘shared’.
El fichero iOSApp.swift es el punto de entrada a la aplicación. Se encarga de inicializar y configurar la inyección de dependencias (‘Locator’) y es donde se debe de registrar las implementaciones nativas como los servicios y navegadores.
UI
Se encuentran los componentes de la aplicación.
Features
Contiene las pantallas completas y las envolturas (‘Wrapper’) de los ‘ViewModel’ correspondientes del ‘shared’ para poder actuar de puente y reaccionar a los cambios de estado en iOS.
Controls
Contiene las vistas de UI genéricos y reutilizables que se usan en múltiples pantallas como botones, campos de formulario, etc.
Theme
Define la apariencia visual de la aplicación como los colores, tipografía y estilo de botones, etc.
Navigation
Contiene las implementaciones concretas de los contratos de navegación definidos en el módulo shared.
Services
Contiene las implementaciones nativas de iOS para las interfaces de servicios. Como el caso del spinner de carga o la presentación de diálogos.