Używanie Hilt z innymi bibliotekami Jetpack

Hilt zawiera rozszerzenia do udostępniania klas z innych bibliotek Jetpack. Hilt obsługuje obecnie te komponenty Jetpack:

  • Utwórz
  • ViewModel
  • Nawigacja
  • WorkManager

Aby korzystać z tych integracji, musisz dodać zależności Hilt. Więcej informacji o dodawaniu zależności znajdziesz w artykule Wstrzykiwanie zależności za pomocą Hilta.

Integracja z Jetpack Compose

Aby dowiedzieć się, jak Hilt integruje się z Jetpack Compose, zapoznaj się z sekcją Hilt w artykule Compose i inne biblioteki.

Wstrzykiwanie obiektów ViewModel za pomocą Hilt

Podaj ViewModel, dodając do niego adnotację @HiltViewModel i używając adnotacji @Inject w konstruktorze obiektu ViewModel.

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

Następnie aktywność, która jest oznaczona symbolem @AndroidEntryPoint, może uzyskać instancję ViewModel w normalny sposób za pomocą ViewModelProvider lub by viewModels() rozszerzeń KTX:

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

Używanie wstrzykiwania z pomocą w przypadku ViewModeli

Hilt obsługuje wstrzykiwanie wspomagane w przypadku klas ViewModel. Wstrzykiwanie wspomagane umożliwia wstrzykiwanie dynamicznych argumentów środowiska wykonawczego wraz z zależnościami zarządzanymi przez Hilt. Aby użyć wstrzykiwania wspomaganego, dodaj do konstruktora ViewModel adnotację @AssistedInject, a parametry dynamiczne oznacz adnotacją @Assisted. Musisz też zdefiniować interfejs@AssistedFactory, który będzie działać jako pomost dla Hilta, aby automatycznie generować niezbędne @ViewModelProvider.Factory.

@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
    }
}

W Compose możesz użyć fabryki wspomaganej, przekazując ją do funkcji hiltViewModel podczas nawigacji lub inicjowania ekranu. Takie podejście eliminuje konieczność ręcznego tworzenia kodu fabrycznego, a jednocześnie zapewnia prawidłowe określenie zakresu ViewModel w stosie wstecznym nawigacji. Więcej informacji znajdziesz w dokumentacji Hilt na temat wstrzykiwania wspomaganego.

@ViewModelScoped

Wszystkie obiekty ViewModel Hilt są dostarczane przez ViewModelComponent, który ma taki sam cykl życia jak ViewModel, i dlatego może przetrwać zmiany konfiguracji. Aby ograniczyć zakres zależności do ViewModel, użyj adnotacji @ViewModelScoped.

Typ @ViewModelScoped sprawi, że pojedyncza instancja typu o określonym zakresie będzie dostępna we wszystkich zależnościach wstrzykiwanych do ViewModel. Inne instancje klasy ViewModel, które zażądają instancji w zakresie, otrzymają inną instancję.

Jeśli pojedyncza instancja ma być udostępniana w różnych obiektach ViewModel, należy ją ograniczyć za pomocą adnotacji @ActivityRetainedScoped lub @Singleton.

Integracja z bibliotekami nawigacji Jetpack

Dodaj do pliku Gradle te dodatkowe zależności:

app/build.gradle

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0")
}

Dynamiczny

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

W Jetpack Compose biblioteki Navigation Compose i Navigation 3 używają funkcji hiltViewModel do automatycznego pobierania ViewModela w zakresie bieżącego miejsca docelowego nawigacji.

W Navigation 3 miejsca docelowe nawigacji są reprezentowane przez NavEntry. Określ zakres ViewModels na NavEntrys za pomocą rememberViewModelStoreNavEntryDecorator. Użyj hiltViewModel w ramach dostawcy, aby pobrać powiązany element NavEntry.

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

W Navigation Compose obiekty ViewModel są automatycznie ograniczone do miejsc docelowych nawigacji. Więcej informacji znajdziesz w artykule Hilt i Navigation.

val viewModel = hiltViewModel()

Wstrzykiwanie biblioteki WorkManager za pomocą Hilt

Dodaj do pliku Gradle te dodatkowe zależności: Pamiętaj, że oprócz biblioteki musisz uwzględnić dodatkowy procesor adnotacji, który działa na podstawie procesora adnotacji Hilt:

app/build.gradle

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    ksp("androidx.hilt:hilt-compiler:1.4.0")
}

Dynamiczny

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

Wstrzyknij Worker za pomocą adnotacji @HiltWorker w klasie i @AssistedInject w konstruktorze obiektu Worker. W obiektach Worker możesz używać tylko powiązań @Singleton lub powiązań bez zakresu. Musisz też dodać adnotacje do zależności ContextWorkerParameters za pomocą @Assisted:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

Następnie klasa Application musi zaimplementować interfejs Configuration.Provider, wstrzyknąć instancję HiltWorkFactory i przekazać ją do konfiguracji WorkManager w ten sposób:

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

  @Inject lateinit var workerFactory: HiltWorkerFactory

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