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 Jetpacka:

  • 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, 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ść oznaczona 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 obiektami ViewModel

Hilt obsługuje wstrzykiwanie wspomagane w przypadku modeli widoku. 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 i oznacz parametry dynamiczne adnotacją @Assisted. Musisz też zdefiniować interfejs @AssistedFactory, który działa jako most, dzięki któremu Hilt może 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. Dzięki temu nie trzeba ręcznie tworzyć szablonu fabryki, a ViewModel jest prawidłowo ograniczony do stosu wstecznego nawigacji. Więcej informacji znajdziesz w dokumentacji Hilt dotyczącej wstrzykiwania wspomaganego.

@ViewModelScoped

Wszystkie obiekty ViewModel Hilt są dostarczane 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 określonym zakresie będzie udostępniana we wszystkich zależnościach wstrzykiwanych do ViewModel. Inne instancje ViewModel, które żądają instancji o określonym zakresie, otrzymają inną instancję.

Jeśli pojedyncza instancja musi być udostępniana w różnych modelach ViewModel, należy określić jej zakres za pomocą @ActivityRetainedScoped lub @Singleton.

integracja z bibliotekami nawigacyjnymi 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 obiektu ViewModel ograniczonego do bieżącego miejsca docelowego nawigacji.

W Nawigacji 3 miejsca docelowe są reprezentowane przez NavEntry. Określ zakres ViewModel dla NavEntry za pomocą rememberViewModelStoreNavEntryDecorator. Użyj hiltViewModel w dostawcy 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 modele widoku są automatycznie ograniczane do miejsc docelowych nawigacji. Więcej informacji znajdziesz w sekcji Hilt i Nawigacja.

val viewModel = hiltViewModel()

Wstrzykiwanie WorkManagera za pomocą Hilta

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 procesorze 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, używając 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ć 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 skonfiguruj klasę Application tak, aby implementowała interfejs Configuration.Provider, wstrzyknij instancję HiltWorkFactory i przekaż 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()
}