Inyección de dependencias con Hilt
Simplifique la gestión de dependencias con Hilt. Use @HiltAndroidApp, @AndroidEntryPoint, @HiltViewModel, @Module, @Provides y ámbitos @Singleton.
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:
@HiltAndroidAppen su clase Application@AndroidEntryPointen Activities y Fragments@Inject constructorpara las clases inyectables@HiltViewModel+@Inject constructorpara los ViewModels@Module+@Providespara clases e interfaces de terceros@Singletonpara compartir una instancia en toda la aplicación
Siguiente: notificaciones push con Firebase Cloud Messaging.
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
- ViewModel y LiveData
- Base de datos Room
- Corrutinas y funciones suspend
- Patrón Repository
- Navigation Component
- Inyección de dependencias con Hilt