Używanie Hilt z innymi bibliotekami Jetpack

Hilt zawiera rozszerzenia umożliwiające udostępnianie 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ą Hilt.

Integracja z Jetpack Compose

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

Wstrzykiwanie obiektów ViewModel za pomocą Hilt

Udostępnij 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ść z adnotacją @AndroidEntryPoint może uzyskać instancję ViewModel w normalny sposób, używając ViewModelProvider lub by viewModels() rozszerzeń KTX:

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

Używanie wstrzykiwania wspomaganego z ViewModels

Hilt obsługuje wstrzykiwanie wspomagane w przypadku ViewModels. Wstrzykiwanie wspomagane umożliwia wstrzykiwanie dynamicznych argumentów środowiska wykonawczego wraz z zależnościami zarządzanymi przez Hilt. Aby używać wstrzykiwania wspomaganego, dodaj do konstruktora ViewModel adnotację @AssistedInject, i oznacz dynamiczne parametry adnotacją @Assisted. Musisz też zdefiniować interfejs @AssistedFactory, który będzie służyć jako pomost dla Hilt, aby automatycznie wygenerować niezbędny element @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. Dzięki temu nie musisz ręcznie tworzyć kodu fabryki, a ViewModel pozostaje prawidłowo ograniczony do stosu wstecznego nawigacji. Więcej informacji znajdziesz w dokumentacji Hilt na temat wstrzykiwania wspomaganego.

@ViewModelScoped

Wszystkie ViewModels Hilt są udostępniane przez ViewModelComponent, który ma taki sam cykl życia jak ViewModel, dzięki czemu 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 ograniczonym zakresie będzie udostępniana we wszystkich zależnościach wstrzykiwanych do ViewModel. Inne instancje ViewModel, które zażądają instancji o ograniczonym zakresie, otrzymają inną instancję.

Jeśli pojedyncza instancja ma być współdzielona przez różne ViewModels, należy ograniczyć jej zakres za pomocą @ActivityRetainedScoped lub @Singleton.

Integracja z bibliotekami nawigacji Jetpack

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

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, aby automatycznie pobierać ViewModel o ograniczonym zakresie do bieżącego miejsca docelowego nawigacji.

W Navigation 3 miejsca docelowe nawigacji są reprezentowane przez NavEntry. Ogranicz zakres ViewModels do NavEntrys za pomocą rememberViewModelStoreNavEntryDecorator. Użyj hiltViewModel wewnątrz aprowizatora dla tego NavEntry, aby pobrać powiązany ViewModel.

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

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

val viewModel = hiltViewModel()

Wstrzykiwanie WorkManager za pomocą Hilt

Dodaj te dodatkowe zależności do pliku Gradle. Pamiętaj, że oprócz biblioteki musisz dodać 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.3.0")
}

Dynamiczny

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

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

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

Następnie klasa Application musi implementować interfejs Configuration.Provider, wstrzykiwać instancję HiltWorkFactory i przekazywać 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()
}