Hilt incluye extensiones para proporcionar clases de otras bibliotecas de Jetpack. Por el momento, Hilt admite los siguientes componentes de Jetpack:
ViewModel
WorkManager
Debes agregar las dependencias de Hilt para aprovechar estas integraciones. Para obtener más información sobre cómo agregar dependencias, consulta Inyección de dependencias con inserción.
Cómo inyectar objetos ViewModel 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
...
dependencies {
...
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha01'
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
// When using Java.
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
}
Proporciona un ViewModel
con la anotación @ViewModelInject
en el constructor del objeto ViewModel
. También debes anotar la dependencia SavedStateHandle
con @Assisted
:
Kotlin
class ExampleViewModel @ViewModelInject constructor( private val repository: ExampleRepository, @Assisted private val savedStateHandle: SavedStateHandle ) : ViewModel() { ... }
Java
public class ExampleViewModel extends ViewModel { private final ExampleRepository repository; private final SavedStateHandle savedStateHandle; @ViewModelInject ExampleViewModel( ExampleRepository repository, @Assisted SavedStateHandle savedStateHandle) { this.repository = repository; this.savedStateHandle = savedStateHandle; } ... }
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); } ... }
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
...
dependencies {
...
implementation 'androidx.hilt:hilt-work:1.0.0-alpha01'
// When using Kotlin.
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
// When using Java.
annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0-alpha01'
}
Inyecta un Worker
con la anotación @WorkerInject
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
class ExampleWorker @WorkerInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Java
public class ExampleWorker extends Worker { private final WorkerDependency workerDependency; @WorkerInject 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
, inyecta 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 Configuration.Builder() .setWorkerFactory(workerFactory) .build(); } }