Contenido del curso
Arquitectura y Almacenamiento de Datos
Repositorios y Gestión de Datos
Capa de Presentación y Navegación
- 12

HomeScreen con ViewModel, StateFlow y Coil
26:24 min - 13

Primera app Android con Hilt, Retrofit y Room
09:58 min - 14

Implementación de Barra de Navegación Inferior en Android Compose
13:05 min - 15

Creación de un Detail Screen en Jetpack Compose para Android
25:49 min - 16

Formulario de preórdenes con SharedFlow en Compose
20:02 min - 17

Lista y sincroniza preórdenes con StateFlow
23:58 min
Optimización y Flexibilidad
Cómo estructurar la capa de data con Retrofit
Resumen
Organizar un proyecto Android con Clean Architecture te permite separar responsabilidades en capas claras: presentación, dominio y datos. Aquí aprenderás a montar la capa de data con Retrofit, Moshi y Hilt para que tu app se comunique con una API remota de forma limpia y escalable.
Qué capas componen Clean Architecture en Android
Clean Architecture divide tu proyecto en tres capas con responsabilidades específicas, y entender cada una te ahorra dolores de cabeza cuando el proyecto crece.
- Capa de UI o presentación: contiene los elementos visibles para el usuario, como textos, botones, composables y view models. Solo maneja la lógica de presentación.
- Capa de domain: define las entidades de dominio y las interfaces de los repositorios. Es la capa más estable y sin dependencias externas.
- Capa de data: implementa los repositorios y los data sources. Se encarga de la persistencia y de la comunicación con fuentes externas como tu API.
¿Por qué la capa de data es tan importante en Clean Architecture? Porque separa la información remota de la información local. Eso te permite cambiar tu fuente de datos sin tocar la lógica de negocio ni la UI.
Cómo crear un DTO con Moshi para deserializar JSON
Dentro del paquete data vas a crear una data class llamada OrderDTO. Este objeto representa la respuesta JSON que llega desde la API [01:30].
La clase lleva la anotación @JsonClass(generateAdapter = true), propia de Moshi, que genera el adaptador de serialización en tiempo de compilación. Sus propiedades incluyen un id de tipo string, un item con el nombre del producto, un customerName también string, un total de tipo double y un imageURL string.
Cuando el nombre del campo en el JSON no coincide con el de tu propiedad en Kotlin, usas la anotación @Json(name = "...") de Moshi. Por ejemplo, mapeas customerName e imageURL al nombre exacto que viene en la respuesta del servidor.
Cómo definir la interfaz de Retrofit para consumir la API
La interfaz BizOrderApi declara los endpoints que tu app va a consumir. Retrofit se encarga de generar la implementación a partir de las anotaciones que pongas en cada método [02:45].
kotlin interface BizOrderApi { @GET("getOrders") suspend fun getOrders(): Response<List<OrderDTO>>
@POST("/preordersSuccess") suspend fun savePreorders(): Response<Unit>
}
La palabra clave suspend viene de corrutinas y marca la función como suspendida, lo que te permite ejecutarla sin bloquear el hilo principal. El tipo Response<T> es propio de Retrofit y encapsula el resultado de la llamada.
En savePreorders devuelves Response<Unit> porque solo necesitas saber si la operación fue exitosa o falló. Si la API devolviera datos relevantes, crearías un DTO específico para deserializar la respuesta con Moshi, guardarla en base de datos o notificar al usuario.
¿Qué es un DTO y para qué sirve? Un Data Transfer Object es una clase que modela la estructura del JSON que recibe o envía tu API. Sirve para mapear datos entre el servidor y tu aplicación de forma tipada y segura.
Cómo configurar Hilt para inyectar Retrofit y la API
Hilt simplifica la inyección de dependencias en Android. Vas a crear un paquete di con dos módulos: uno para la API y otro para Retrofit [04:20].
Cómo crear el módulo ApisModule
El módulo ApisModule provee la instancia de BizOrderApi. Lleva las anotaciones @Module y @InstallIn(SingletonComponent::class) para que viva durante toda la vida de la app.
kotlin @Module @InstallIn(SingletonComponent::class) object ApisModule { @Provides @Singleton fun provideBizOrderApi(retrofit: Retrofit): BizOrderApi = retrofit.create(BizOrderApi::class.java) }
Con esto cualquier clase que necesite BizOrderApi la recibe automáticamente por inyección, sin instanciarla manualmente.
Cómo configurar el módulo de Retrofit y OkHttp
El módulo de Retrofit provee dos cosas: una instancia de OkHttpClient con un HttpLoggingInterceptor configurado en nivel BODY para ver las respuestas en consola, y la instancia de Retrofit con la base URL.
- La base URL la copias desde tu perfil en Beeceptor, en la sección Your Endpoints, dentro del proyecto que creaste.
- El cliente HTTP se configura con el interceptor de logging para depurar las llamadas.
- Retrofit recibe el cliente, el converter de Moshi y la base URL para quedar listo.
kotlin @Provides @Singleton fun provideHttpClient(): OkHttpClient { val logging = HttpLoggingInterceptor().apply { level = HttpLoggingInterceptor.Level.BODY } return OkHttpClient.Builder() .addInterceptor(logging) .build() }
Con Retrofit, Moshi y el cliente HTTP listos, tu capa de data ya tiene todo lo necesario para conectarse al servidor. En la siguiente clase vas a construir el RemoteDataSource, que será el encargado de orquestar las llamadas a la API.
¿Ya estructuraste tu proyecto en capas? Cuéntame en los comentarios cómo organizas tu paquete de data en Android.