Hilt enthält Erweiterungen zum Bereitstellen von Klassen aus anderen Jetpack-Bibliotheken. Hilt unterstützt derzeit die folgenden Jetpack-Komponenten:
- Schreiben
ViewModel- Navigation
- WorkManager
Sie müssen die Hilt-Abhängigkeiten hinzufügen, um diese Integrationen nutzen zu können. Weitere Informationen zum Hinzufügen von Abhängigkeiten finden Sie unter Abhängigkeitsinjektion mit Hilt.
Integration in Jetpack Compose
Informationen zur Einbindung von Hilt in Jetpack Compose finden Sie im Abschnitt „Hilt“ unter Compose und andere Bibliotheken.
ViewModel-Objekte mit Hilt einfügen
Stellen Sie einen ViewModel bereit, indem Sie ihn mit @HiltViewModel annotieren und die Annotation @Inject im Konstruktor des ViewModel-Objekts verwenden.
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Anschließend kann eine mit @AndroidEntryPoint annotierte Aktivität die ViewModel-Instanz wie gewohnt über ViewModelProvider oder die by viewModels()-KTX-Erweiterungen abrufen:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Unterstützte Injektion mit ViewModels verwenden
Hilt unterstützt die assistierte Injektion für ViewModels. Mit der unterstützten Injektion können Sie dynamische Laufzeitargumente zusammen mit von Hilt verwalteten Abhängigkeiten einfügen. Wenn Sie die unterstützte Injektion verwenden möchten, annotieren Sie Ihren ViewModel-Konstruktor mit @AssistedInject und kennzeichnen Sie dynamische Parameter mit @Assisted. Außerdem müssen Sie eine @AssistedFactory-Schnittstelle definieren, die als Brücke für Hilt dient, um die erforderliche @ViewModelProvider.Factory automatisch zu generieren.
@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 } }
In Compose können Sie die unterstützte Factory verwenden, indem Sie sie während der Navigation oder Bildschirminitialisierung an die Funktion hiltViewModel übergeben. Bei diesem Ansatz ist kein manueller Factory-Boilerplate-Code erforderlich, während das ViewModel korrekt auf den Navigations-Back-Stack beschränkt bleibt. Weitere Informationen finden Sie in der Hilt-Dokumentation zur unterstützten Injektion.
@ViewModelScoped
Alle Hilt-ViewModels werden von der ViewModelComponent bereitgestellt, die denselben Lebenszyklus wie eine ViewModel hat und daher Konfigurationsänderungen überstehen kann.
Wenn Sie eine Abhängigkeit auf einen ViewModel beschränken möchten, verwenden Sie die Annotation @ViewModelScoped.
Ein @ViewModelScoped-Typ sorgt dafür, dass eine einzelne Instanz des Bereichstyps für alle Abhängigkeiten bereitgestellt wird, die in die ViewModel eingefügt werden.
Andere Instanzen eines ViewModels, die die bereichsbezogene Instanz anfordern, erhalten eine andere Instanz.
Wenn eine einzelne Instanz von verschiedenen ViewModels gemeinsam genutzt werden muss, sollte sie entweder mit @ActivityRetainedScoped oder @Singleton definiert werden.
Einbindung in die Jetpack-Navigationsbibliotheken
Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu:
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' }
In Jetpack Compose verwenden die Bibliotheken Navigation Compose und Navigation 3 die Funktion hiltViewModel, um automatisch ein ViewModel abzurufen, das auf das aktuelle Navigationsziel beschränkt ist.
In Navigation 3 werden Navigationsziele durch NavEntrys dargestellt.
ViewModels auf NavEntrys beschränken mit rememberViewModelStoreNavEntryDecorator. Verwenden Sie hiltViewModel im Anbieter für dieses NavEntry, um das zugehörige ViewModel abzurufen.
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
In Navigation Compose werden ViewModels automatisch auf Navigationsziele beschränkt. Weitere Informationen findest du unter Hilt und Navigation.
val viewModel = hiltViewModel()
WorkManager mit Hilt einfügen
Fügen Sie Ihrer Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu. Zusätzlich zur Bibliothek müssen Sie einen weiteren Annotation Processor einbinden, der auf dem Hilt Annotation Processor aufbaut:
app/build.gradle
Kotlin
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. ksp("androidx.hilt:hilt-compiler:1.4.0") }
Groovy
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.4.0' }
Fügen Sie ein Worker mit der Annotation @HiltWorker in der Klasse und @AssistedInject im Konstruktor des Worker-Objekts ein. In Worker-Objekten können Sie nur @Singleton- oder ungebundene Bindungen verwenden. Außerdem müssen Sie die Abhängigkeiten Context und WorkerParameters mit @Assisted annotieren:
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Lassen Sie dann die Application-Klasse die Configuration.Provider-Schnittstelle implementieren, fügen Sie eine Instanz von HiltWorkFactory ein und übergeben Sie sie so an die WorkManager-Konfiguration:
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }