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 Dependency Injection mit Hilt.
Integration mit Jetpack Compose
Informationen zur Integration von Hilt in Jetpack Compose finden Sie im Abschnitt zu Hilt unter Compose und andere Bibliotheken.
ViewModel-Objekte mit Hilt einschleusen
Stellen Sie ein ViewModel bereit, indem Sie es 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() { ... }
Eine mit @AndroidEntryPoint annotierte Aktivität kann dann wie gewohnt mit ViewModelProvider oder den by viewModels() KTX-Erweiterungen auf die ViewModel-Instanz zugreifen:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Unterstützte Injection 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 den ViewModel-Konstruktor mit @AssistedInject und markieren Sie dynamische Parameter mit @Assisted. Außerdem müssen Sie eine @AssistedFactory-Schnittstelle definieren, die als Brücke für Hilt dient, damit die erforderlichen @ViewModelProvider.Factory automatisch generiert werden.
@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. So ist kein manueller Boilerplate-Code für die Factory mehr erforderlich und Ihr ViewModel ist weiterhin korrekt auf den Backstack der Navigation beschränkt. Weitere Informationen finden Sie in der Hilt-Dokumentation zum Assisted Injection.
@ViewModelScoped
Alle Hilt-ViewModels werden von ViewModelComponent bereitgestellt, das denselben Lebenszyklus wie ein ViewModel hat und daher Konfigurationsänderungen überstehen kann.
Verwenden Sie die Annotation @ViewModelScoped, um eine Abhängigkeit auf ein ViewModel zu beschränken.
Bei einem @ViewModelScoped-Typ wird eine einzelne Instanz des bereichsbezogenen Typs für alle Abhängigkeiten bereitgestellt, die in ViewModel eingefügt werden.
Andere Instanzen eines ViewModels, die die Instanz mit Bereich anfordern, erhalten eine andere Instanz.
Wenn eine einzelne Instanz für verschiedene ViewModels freigegeben werden muss, sollte sie entweder mit @ActivityRetainedScoped oder @Singleton festgelegt werden.
Integration 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 sowohl die Bibliotheken „Navigation Compose“ als auch „Navigation 3“ die Funktion hiltViewModel, um automatisch ein ViewModel abzurufen, das auf das aktuelle Navigationsziel beschränkt ist.
In Navigation 3 werden Navigationsziele durch NavEntry dargestellt.
ViewModel-Bereich auf NavEntrys festlegen mit
rememberViewModelStoreNavEntryDecorator. Verwenden Sie hiltViewModel im Anbieter für diesen 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 finden Sie 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 basiert:
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 die Klasse und @AssistedInject in den Konstruktor des Worker-Objekts ein. In Worker-Objekten können Sie nur @Singleton- oder Bindungen ohne Bereich 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 Ihre Application-Klasse das Configuration.Provider-Interface 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() }