Android Academy · Lección

Inyección de dependencias con Hilt

Simplifique la gestión de dependencias con Hilt. Use @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides y ámbitos @Singleton.

Lección 6 de 613 pasos

Inyección de dependencias con Hilt es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 6 de 6. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 6 lecciones en total.

¿Qué es la inyección de dependencias?

La inyección de dependencias (DI) consiste en proporcionar a un objeto lo que necesita, en lugar de hacer que cree sus propias dependencias.

Sin DI, una clase crea sus propias dependencias: el acoplamiento es fuerte y resulta difícil probarla. Con DI, las dependencias se inyectan desde el exterior: el acoplamiento es débil y resulta fácil probarlas y sustituirlas.

DI manual frente a Hilt

La DI manual funciona, pero se vuelve problemática a medida que el proyecto crece:

// Manual DI — you create and pass everything:
val db = AppDatabase.getInstance(context)
val dao = db.userDao()
val repo = UserRepository(dao)
val factory = UserViewModel.Factory(repo)
val viewModel = ViewModelProvider(this, factory)[UserViewModel::class.java]

// With Hilt:
// Just annotate, Hilt does the wiring
@HiltViewModel
class UserViewModel @Inject constructor(private val repo: UserRepository) : ViewModel()

Añadir Hilt

Añada Hilt a su proyecto:

// project/build.gradle:
buildscript {
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
    }
}

// app/build.gradle:
plugins {
    id 'com.google.dagger.hilt.android'
    id 'kotlin-kapt'
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.51'
    kapt 'com.google.dagger:hilt-android-compiler:2.51'
}

@HiltAndroidApp

Anote su clase Application con @HiltAndroidApp. Este es el punto de entrada de la jerarquía de componentes de Hilt:

@HiltAndroidApp
class MyApp : Application()

// Also register in AndroidManifest.xml:
// <application android:name=".MyApp" ...>

@AndroidEntryPoint

Añada @AndroidEntryPoint a las Activities, Fragments y Services que necesiten dependencias inyectadas:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var analytics: AnalyticsService

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        analytics.logEvent("app_open")
    }
}

@AndroidEntryPoint
class HomeFragment : Fragment() {
    // Fragment's parent Activity must also be @AndroidEntryPoint
}

@Inject: inyección mediante constructor

Marque el constructor con @Inject para indicar a Hilt cómo crear la clase. Hilt resuelve automáticamente todos los parámetros:

class UserRepository @Inject constructor(
    private val userDao: UserDao,
    private val apiService: ApiService
) {
    suspend fun getUsers() = userDao.getAll()
    suspend fun syncFromNetwork() {
        val users = apiService.fetchUsers()
        userDao.insertAll(users)
    }
}

// Hilt sees UserRepository needs UserDao and ApiService,
// and automatically creates and injects them.

@HiltViewModel

Anote su ViewModel con @HiltViewModel y use @Inject constructor. En el Fragment, obténgalo con by viewModels():

@HiltViewModel
class UserViewModel @Inject constructor(
    private val repo: UserRepository
) : ViewModel() {

    val users = repo.getUsersFlow().asLiveData()
}

// In Fragment:
@AndroidEntryPoint
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()  // Hilt provides it
}

@Module y @Provides

Cuando Hilt no puede usar la inyección mediante constructor (por ejemplo, con interfaces o clases de terceros), proporcione instancias mediante un @Module:

@Module
@InstallIn(SingletonComponent::class)   // lives for app lifetime
object NetworkModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Provides
    @Singleton
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

@Binds: vinculación de interfaces

Use @Binds para indicar a Hilt qué implementación debe usar para una interfaz:

interface AnalyticsService {
    fun logEvent(name: String)
}

class FirebaseAnalytics @Inject constructor() : AnalyticsService {
    override fun logEvent(name: String) { /* Firebase impl */ }
}

@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {

    @Binds
    @Singleton
    abstract fun bindAnalytics(impl: FirebaseAnalytics): AnalyticsService
}

Ámbitos de Hilt

Los ámbitos controlan cuánto tiempo vive una instancia inyectada:

  • @Singleton — una instancia durante toda la vida de la aplicación (ApplicationComponent)
  • @ActivityRetainedScoped — sobrevive a los cambios de configuración
  • @ActivityScoped — una instancia por Activity
  • @FragmentScoped — una instancia por Fragment
  • @ViewModelScoped — una instancia por ViewModel

Pruebas con Hilt

Sustituya las dependencias reales por implementaciones falsas en las pruebas mediante el soporte de pruebas de Hilt:

@HiltAndroidTest
class UserRepositoryTest {

    @get:Rule
    val hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var repo: UserRepository

    @Before
    fun setUp() {
        hiltRule.inject()
    }

    @Test
    fun usersAreFetched() {
        assertNotNull(repo)
    }
}

Comprobación rápida

¿Qué anotación indica a Hilt que genere la jerarquía de componentes de DI para toda la aplicación?

Repaso: inyección de dependencias con Hilt

Hilt hace que la DI sea prácticamente automática en Android:

  • @HiltAndroidApp en su clase Application
  • @AndroidEntryPoint en Activities y Fragments
  • @Inject constructor para las clases inyectables
  • @HiltViewModel + @Inject constructor para los ViewModels
  • @Module + @Provides para clases e interfaces de terceros
  • @Singleton para compartir una instancia en toda la aplicación

Siguiente: notificaciones push con Firebase Cloud Messaging.

Gratis para empezar

Aprende Kotlin con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
36
Lecciones
152

Preguntas frecuentes

¿La lección «Inyección de dependencias con Hilt» es gratis?

Sí — el texto completo de «Inyección de dependencias con Hilt» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 6 lecciones en total.

¿Qué aprenderé en «Inyección de dependencias con Hilt»?

Simplifique la gestión de dependencias con Hilt. Use @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides y ámbitos @Singleton. Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 6 de 6.

¿Cuánto tiempo toma la lección «Inyección de dependencias con Hilt»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. ViewModel y LiveData
  2. Base de datos Room
  3. Corrutinas y funciones suspend
  4. Patrón Repository
  5. Navigation Component
  6. Inyección de dependencias con Hilt
← Volver a Android Academy