Hilt/Dagger para Kotlin: guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a la Inyección de Dependencias y las bibliotecas Hilt/Dagger

\n\n

En el desarrollo moderno de aplicaciones en Kotlin (especialmente para Android), uno de los conceptos arquitectónicos clave es la Inyección de Dependencias (DI). Es un patrón de diseño en el que un objeto recibe sus dependencias desde el exterior, en lugar de crearlas por sí mismo. Esto hace que el código sea más flexible, comprobable y mantenible.

\n\n

Dagger es un potente framework para DI, desarrollado por Google, que genera código en tiempo de compilación. Garantiza que todas las dependencias se proporcionen correctamente y elimina los errores en tiempo de ejecución relacionados con la falta de dependencias. Sin embargo, Dagger tiene una curva de aprendizaje pronunciada debido a su complejidad.

\n\n

Hilt es una capa sobre Dagger, creada para simplificar su uso en aplicaciones Android. Hilt proporciona componentes estándar, anotaciones de ámbito e integración automática con el ciclo de vida de Android (Activity, Fragment, ViewModel, etc.). Si estás escribiendo en Kotlin para Android, Hilt es la opción recomendada, ya que reduce significativamente el código repetitivo (boilerplate).

\n\n

En este artículo, analizaremos ambas bibliotecas en detalle, pero nos centraremos principalmente en Hilt, por ser la herramienta más moderna y conveniente. Aprenderás cómo instalar Hilt, cómo usar sus anotaciones y métodos principales, y también analizaremos ejemplos reales y errores típicos.

\n\n

Instalación de Hilt en un proyecto Kotlin/Android

\n\n

Hilt no se instala a través de pip o npm. Se integra en un proyecto Gradle. Para Kotlin y Android, el proceso es el siguiente:

\n\n

1. Agregar el plugin de Hilt en el build.gradle raíz (a nivel de proyecto)

\n
// build.gradle (Project)\nbuildscript {\n    repositories {\n        google()\n        mavenCentral()\n    }\n    dependencies {\n        // ... otros plugins\n        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.50' // Verifique la versión actual\n    }\n}\n
\n\n

2. Aplicar el plugin en el build.gradle del módulo de la aplicación (a nivel de módulo)

\n
// build.gradle (Module: app)\nplugins {\n    id 'com.android.application'\n    id 'org.jetbrains.kotlin.android'\n    id 'kotlin-kapt' // Obligatorio para Hilt\n    id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n    // ... su configuración\n}\n\ndependencies {\n    implementation 'com.google.dagger:hilt-android:2.50'\n    kapt 'com.google.dagger:hilt-compiler:2.50'\n\n    // Para ViewModel (opcional, pero recomendado)\n    implementation 'androidx.hilt:hilt-navigation-compose:1.1.0' // Para Jetpack Compose\n    // o\n    implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03' // Para versiones antiguas\n}\n
\n\n

3. Configurar la clase Application

\n

Toda aplicación que use Hilt debe tener una clase Application anotada con @HiltAndroidApp.

\n
import android.app.Application\nimport dagger.hilt.android.HiltAndroidApp\n\n@HiltAndroidApp\nclass MyApplication : Application() {\n    override fun onCreate() {\n        super.onCreate()\n        // Inicialización de la aplicación\n    }\n}\n
\n

No olvides especificar esta clase en el AndroidManifest.xml:

\n
<application\n    android:name=".MyApplication"\n    ... >\n
\n\n

Inicio rápido con un ejemplo de código

\n\n

Vamos a crear un ejemplo simple: una aplicación que saluda al usuario, usando Hilt para inyectar la dependencia Greeter.

\n\n

Paso 1: Crear la clase que se va a inyectar

\n
import javax.inject.Inject\n\nclass Greeter @Inject constructor() {\n    fun greet(name: String): String {\n        return "Hello, $name!"\n    }\n}\n
\n

La anotación @Inject en el constructor le dice a Hilt cómo crear una instancia de esta clase.

\n\n

Paso 2: Inyección en una Activity

\n
import android.os.Bundle\nimport android.widge                    

Recommendations