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

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