Hilt включает расширения для предоставления классов из других библиотек Jetpack. В настоящее время Hilt поддерживает следующие компоненты Jetpack:
- Сочинить
-
ViewModel - Навигация
- Менеджер работ
Для использования этих интеграций необходимо добавить зависимости 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 или расширения KTX, by viewModels() :
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
Используйте вспомогательную инъекцию с ViewModel.
Hilt поддерживает вспомогательную инъекцию зависимостей для ViewModel. Вспомогательная инъекция позволяет внедрять динамические аргументы во время выполнения вместе с зависимостями, управляемыми Hilt. Для использования вспомогательной инъекции аннотируйте конструктор ViewModel с помощью @AssistedInject и пометьте динамические параметры с помощью @Assisted . Также необходимо определить интерфейс @AssistedFactory , который будет служить мостом для автоматической генерации Hilt необходимого @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 } }
В Compose вы можете использовать вспомогательную фабрику, передав её в функцию hiltViewModel во время навигации или инициализации экрана. Такой подход устраняет необходимость в ручном создании шаблонного кода для фабрики, сохраняя при этом корректную область видимости вашей ViewModel в стеке возврата навигации. Для получения дополнительной информации см. документацию Hilt по вспомогательной инъекции .
@ViewModelScoped
Все ViewModel в Hilt предоставляются компонентом ViewModelComponent , который имеет тот же жизненный цикл, что и ViewModel , и, следовательно, может сохраняться при изменении конфигурации. Для ограничения области действия зависимости от ViewModel используйте аннотацию @ViewModelScoped .
Использование аннотации @ViewModelScoped гарантирует, что для всех зависимостей, внедряемых в ViewModel , будет предоставлен единственный экземпляр этого типа с указанной областью видимости. Другие экземпляры ViewModel, запрашивающие экземпляр с указанной областью видимости, получат другой экземпляр.
Если один экземпляр необходимо использовать совместно несколькими ViewModel, то его область видимости должна быть определена с помощью аннотаций @ActivityRetainedScoped или @Singleton .
Интеграция с библиотеками навигации Jetpack.
Добавьте в свой файл Gradle следующие дополнительные зависимости:
app/build.gradle
Котлин
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
Котлин
dependencies { implementation("androidx.hilt:hilt-work:1.0.0") // When using Kotlin. ksp("androidx.hilt:hilt-compiler:1.3.0") }
Классный
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.3.0' }
Внедрите Worker , используя аннотацию @HiltWorker в классе и @AssistedInject в конструкторе объекта Worker . В объектах Worker можно использовать только @Singleton или привязки без области видимости. Также необходимо аннотировать зависимости Context и WorkerParameters с помощью @Assisted .
@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() }