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 Context i WorkerParameters 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() }