Hilt mit anderen Jetpack-Bibliotheken verwenden

Hilt enthält Erweiterungen zum Bereitstellen von Klassen aus anderen Jetpack-Bibliotheken. Hilt unterstützt derzeit die folgenden Jetpack-Komponenten:

  • Compose
  • 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 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 injizieren

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 Aktivität, die mit @AndroidEntryPoint annotiert ist, kann die ViewModel Instanz dann wie gewohnt mit ViewModelProvider oder den by viewModels() KTX-Erweiterungen abrufen:

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

Assistierte Injektion mit ViewModels verwenden

Hilt unterstützt die assistierte Injektion für ViewModels. Mit der assistierten Injektion können Sie dynamische Laufzeitargumente zusammen mit von Hilt verwalteten Abhängigkeiten injizieren. Wenn Sie die assistierte Injektion verwenden möchten, annotieren Sie den ViewModel-Konstruktor mit @AssistedInject, und kennzeichnen Sie dynamische Parameter mit @Assisted. Sie müssen auch eine @AssistedFactory-Schnittstelle definieren, die als Brücke für Hilt dient, um automatisch die erforderliche @ViewModelProvider.Factory 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 assistierte Factory verwenden, indem Sie sie während der Navigation oder Bildschirminitialisierung an die Funktion hiltViewModel übergeben. So vermeiden Sie manuellen Boilerplate-Code für die Factory und sorgen dafür, dass Ihr ViewModel korrekt an den Back-Stack der Navigation gebunden ist. Weitere Informationen finden Sie in der Hilt-Dokumentation zur assistierten Injektion.

@ViewModelScoped

Alle Hilt-ViewModels werden von der ViewModelComponent bereitgestellt, die denselben Lebenszyklus wie ein ViewModel hat und daher Konfigurationsänderungen überdauern kann. Verwenden Sie die @ViewModelScoped Annotation, um eine Abhängigkeit an ein ViewModel zu binden.

Bei einem @ViewModelScoped-Typ wird eine einzelne Instanz des gebundenen Typs für alle Abhängigkeiten bereitgestellt, die in das ViewModel injiziert werden. Andere Instanzen eines ViewModels, die die gebundene Instanz anfordern, erhalten eine andere Instanz.

Wenn eine einzelne Instanz für mehrere ViewModels freigegeben werden muss, sollte sie entweder mit @ActivityRetainedScoped oder @Singleton gebunden werden.

Integration mit den Jetpack-Navigationsbibliotheken

Fügen Sie der 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 an das aktuelle Navigationsziel gebunden ist.

In Navigation 3 werden Navigationsziele durch NavEntrys dargestellt. Binden Sie ViewModels mit rememberViewModelStoreNavEntryDecorator an NavEntrys. Verwenden Sie hiltViewModel im Provider 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 an Navigationsziele gebunden. Weitere Informationen finden Sie unter Hilt und Navigation.

val viewModel = hiltViewModel()

WorkManager mit Hilt injizieren

Fügen Sie der Gradle-Datei die folgenden zusätzlichen Abhängigkeiten hinzu. Beachten Sie, dass Sie zusätzlich zur Bibliothek einen zusätzlichen Annotation Processor einbinden müssen, 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.3.0")
}

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.3.0'
}

Injizieren Sie ein Worker mit der @HiltWorker Annotation in der Klasse und @AssistedInject im Worker Objekt-Konstruktor. In Worker-Objekten können nur @Singleton- oder nicht gebundene Bindungen verwendet werden. Sie müssen auch 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) { ... }

Implementieren Sie dann die Klasse Application implementieren Sie die Schnittstelle Configuration.Provider, injizieren Sie eine Instanz von HiltWorkFactory und übergeben Sie sie wie folgt an die WorkManager-Konfiguration:

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}