Hilt incluye extensiones para proporcionar clases de otras bibliotecas de Jetpack. Por el momento, Hilt admite los siguientes componentes de Jetpack:
- Redactar
ViewModel- Navegación
- WorkManager
Debes agregar las dependencias de Hilt para aprovechar estas integraciones. Para obtener más información sobre cómo agregar dependencias, consulta Inserción de dependencias con Hilt.
Integración con Jetpack Compose
Para ver cómo se integra Hilt con Jetpack Compose, consulta la sección de Hilt sobre Compose y otras bibliotecas.
Cómo inyectar objetos ViewModel con Hilt
Proporciona un ViewModel. Para ello, anótalo con @HiltViewModel y usa la anotación @Inject en el constructor del objeto ViewModel.
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Luego, una actividad anotada con @AndroidEntryPoint puede obtener la instancia de ViewModel de la forma habitual usando ViewModelProvider o las extensiones KTX de by viewModels():
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Cómo usar la inserción asistida con ViewModels
Hilt admite la inyección asistida para ViewModels. La inyección asistida te permite insertar argumentos dinámicos de tiempo de ejecución junto con las dependencias administradas por Hilt. Para usar la inserción asistida, anota el constructor de tu ViewModel con @AssistedInject y marca los parámetros dinámicos con @Assisted. También debes definir una interfaz @AssistedFactory, que actúa como un puente para que Hilt genere automáticamente el @ViewModelProvider.Factory necesario.
@HiltViewModel(assistedFactory = MyViewModel.Factory::class) class MyViewModel @AssistedInject constructor( @Assisted val userId: String, private val repository: MyRepository ) : ViewModel() { @AssistedFactory interface Factory { fun create(userId: String): MyViewModel } }
En Compose, puedes usar la fábrica asistida pasándola a la función hiltViewModel durante la navegación o la inicialización de la pantalla. Este enfoque elimina la necesidad de código estándar de fábrica manual y, al mismo tiempo, mantiene tu ViewModel correctamente definido en el alcance de la pila de actividades de navegación. Para obtener más información, consulta la documentación de Hilt sobre la inyección asistida.
@ViewModelScoped
Todos los ViewModels de Hilt los proporciona el ViewModelComponent que sigue el mismo ciclo de vida que un ViewModel y, por lo tanto, puede conservar los cambios de configuración.
Para definir el alcance de una dependencia a un ViewModel, usa la anotación @ViewModelScoped.
Un tipo @ViewModelScoped hará que se proporcione una sola instancia del tipo con alcance en todas las dependencias insertadas en ViewModel.
Otras instancias de un ViewModel que soliciten la instancia con alcance recibirán una instancia diferente.
Si se debe compartir una sola instancia entre varios ViewModels, se debe definir el alcance con @ActivityRetainedScoped o @Singleton.
Integración con las bibliotecas de navegación de Jetpack
Agrega las siguientes dependencias adicionales a tu archivo de Gradle:
app/build.gradle
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0' }
En Jetpack Compose, las bibliotecas de Navigation Compose y Navigation 3 usan la función hiltViewModel para recuperar automáticamente un ViewModel con alcance para el destino de navegación actual.
En Navigation 3, los destinos de navegación se representan con NavEntrys.
Define el alcance de los ViewModels para los NavEntrys con rememberViewModelStoreNavEntryDecorator. Usa hiltViewModel dentro del proveedor de ese NavEntry para recuperar el ViewModel asociado.
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
En Navigation Compose, los ViewModels se definen automáticamente para los destinos de navegación. Para obtener más información, consulta Hilt y Navigation.
val viewModel = hiltViewModel()
Cómo inyectar objetos WorkManager con Hilt
Agrega las siguientes dependencias adicionales a tu archivo de Gradle. Ten en cuenta que, además de la biblioteca, debes incluir un procesador de anotaciones adicional que funcione con el procesador de anotaciones de Hilt:
app/build.gradle
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. ksp("androidx.hilt:hilt-compiler:1.3.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.3.0' }
Inserta un Worker con la anotación @HiltWorker en la clase y @AssistedInject en el constructor del objeto Worker. Solo puedes usar objetos @Singleton o vinculaciones sin alcance en objetos Worker. También debes anotar las dependencias Context y WorkerParameters con @Assisted:
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Luego, haz que tu clase Application implemente la interfaz Configuration.Provider, inserta una instancia de HiltWorkFactory y pásala a la configuración WorkManager de la siguiente manera:
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }