Hilt включает расширения для предоставления классов из других библиотек Jetpack. В настоящее время Hilt поддерживает следующие компоненты Jetpack:
- Написать
ViewModel- Навигация
- WorkManager
Чтобы воспользоваться этими интеграциями, необходимо добавить зависимости Hilt. Подробнее о внедрении зависимостей с помощью Hilt…
Интеграция с Jetpack Compose
Чтобы узнать, как интегрировать Hilt с Jetpack Compose, ознакомьтесь с разделом Hilt в статье Compose и другие библиотеки.
Внедрение объектов ViewModel с помощью Hilt
Предоставьте ViewModel, добавив к нему аннотацию @HiltViewModel и используя аннотацию @Inject в конструкторе объекта ViewModel.
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Затем действие, аннотированное с помощью @AndroidEntryPoint, может получить экземпляр ViewModel как обычно, используя ViewModelProvider или by viewModels() расширения KTX:
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Используйте вспомогательную инъекцию с ViewModels
Hilt поддерживает вспомогательное внедрение для ViewModel. Вспомогательное внедрение позволяет внедрять динамические аргументы времени выполнения вместе с зависимостями, управляемыми Hilt. Чтобы использовать вспомогательное внедрение, добавьте в конструктор ViewModel аннотацию @AssistedInject и отметьте динамические параметры аннотацией @Assisted. Также необходимо определить интерфейс @AssistedFactory, который будет служить мостом для автоматического создания нужного @ViewModelProvider.Factory в Hilt.
@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 } }
В Compose вы можете использовать вспомогательную фабрику, передав ее в функцию hiltViewModel во время навигации или инициализации экрана. Этот подход устраняет необходимость в ручном шаблоне фабрики, сохраняя при этом правильную область действия ViewModel в обратном стеке навигации. Дополнительную информацию можно найти в документации по Hilt в разделе Внедрение с помощью ассистента.
@ViewModelScoped
Все модели ViewModel Hilt предоставляются ViewModelComponent, который имеет тот же жизненный цикл, что и ViewModel, и поэтому может пережить изменения конфигурации.
Чтобы ограничить область действия зависимости до ViewModel, используйте аннотацию @ViewModelScoped.
Тип @ViewModelScoped гарантирует, что один экземпляр типа с ограниченной областью действия будет предоставлен для всех зависимостей, внедренных в ViewModel.
Другие экземпляры ViewModel, запрашивающие экземпляр с ограниченной областью действия, получат другой экземпляр.
Если один экземпляр нужно использовать в нескольких ViewModel, его область видимости следует задать с помощью @ActivityRetainedScoped или @Singleton.
Интеграция с библиотеками навигации Jetpack
Добавьте в файл Gradle следующие дополнительные зависимости:
app/build.gradle
Kotlin
dependencies { ... implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0") }
Яркий
dependencies { ... implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0' }
В Jetpack Compose библиотеки Navigation Compose и Navigation 3 используют функцию hiltViewModel, чтобы автоматически получать ViewModel, ограниченную текущим пунктом назначения навигации.
В Navigation 3 пункты назначения представлены объектами NavEntry.
Ограничьте область действия ViewModel до NavEntry с помощью rememberViewModelStoreNavEntryDecorator. Используйте hiltViewModel внутри поставщика для этого NavEntry, чтобы получить связанную ViewModel.
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
В Navigation Compose модели ViewModel автоматически привязываются к пунктам назначения навигации. Подробнее о Hilt и Navigation…
val viewModel = hiltViewModel()
Как внедрить WorkManager с помощью Hilt
Добавьте в файл Gradle следующие дополнительные зависимости: Обратите внимание, что в дополнение к библиотеке вам нужно включить дополнительный инструмент обработки аннотаций, который работает поверх инструмента обработки аннотаций 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") }
Яркий
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.4.0' }
Внедрите Worker, используя аннотацию @HiltWorker в классе и @AssistedInject в конструкторе объекта Worker. В объектах Worker можно использовать только привязки @Singleton или привязки без области действия. Вам также нужно добавить аннотацию @Assisted к зависимостям Context и WorkerParameters:
@HiltWorker class ExampleWorker @AssistedInject constructor( @Assisted appContext: Context, @Assisted workerParams: WorkerParameters, workerDependency: WorkerDependency ) : Worker(appContext, workerParams) { ... }
Затем реализуйте в классе Application интерфейс Configuration.Provider, внедрите экземпляр HiltWorkFactory и передайте его в конфигурацию WorkManager, как показано ниже.
@HiltAndroidApp class ExampleApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getWorkManagerConfiguration() = Configuration.Builder() .setWorkerFactory(workerFactory) .build() }