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() }