Как использовать Hilt с другими библиотеками Jetpack

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