Hilt incluye extensiones para proporcionar clases de otras bibliotecas de Jetpack. Por el momento, Hilt admite los siguientes componentes de Jetpack:
ViewModel
- Navegación
- Compose
- 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.
Cómo insertar 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
.
Kotlin
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Java
@HiltViewModel public class ExampleViewModel extends ViewModel { private final ExampleRepository repository; private final SavedStateHandle savedStateHandle; @Inject ExampleViewModel( SavedStateHandle savedStateHandle, ExampleRepository repository) { this.savedStateHandle = savedStateHandle; this.repository = repository; } ... }
Luego, una actividad o un fragmento anotado con @AndroidEntryPoint
puede obtener la instancia de ViewModel
de la forma habitual usando ViewModelProvider
o las extensiones KTX de by viewModels()
:
Kotlin
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Java
@AndroidEntryPoint public class ExampleActivity extends AppCompatActivity { private ExampleViewModel exampleViewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class); } ... }
@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 la biblioteca de navegación de Jetpack
Agrega las siguientes dependencias adicionales a tu archivo de Gradle:
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0' }
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-navigation-fragment:1.0.0") }
Si tu ViewModel
tiene alcance para el grafo de navegación, usa la función hiltNavGraphViewModels
que funciona con fragmentos anotados con @AndroidEntryPoint
.
Kotlin
val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)
Java
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph); ExampleViewModel exampleViewModel = new ViewModelProvider( backStackEntry, HiltViewModelFactory.create(context, backStackEntry) ).get(ExampleViewModel.class)
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 insertar 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:
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. kapt 'androidx.hilt:hilt-compiler:1.0.0' // When using Java. annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0' }
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. kapt("androidx.hilt:hilt-compiler:1.0.0") // When using Java. annotationProcessor("androidx.hilt:hilt-compiler:1.0.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
:
Kotlin
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Java
@HiltWorker public class ExampleWorker extends Worker { private final WorkerDependency workerDependency; @AssistedInject ExampleWorker( @Assisted @NonNull Context context, @Assisted @NonNull WorkerParameters params, WorkerDependency workerDependency ) { super(context, params); this.workerDependency = workerDependency; } ... }
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:
Kotlin
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }
Java
@HiltAndroidApp public class ExampleApplication extends Application implements Configuration.Provider { @Inject HiltWorkerFactory workerFactory; @Override public Configuration getWorkManagerConfiguration() { return new Configuration.Builder() .setWorkerFactory(workerFactory) .build(); } }