다른 Jetpack 라이브러리와 함께 Hilt 사용

Hilt에는 다른 Jetpack 라이브러리의 클래스를 제공하기 위한 확장 프로그램이 포함되어 있습니다. Hilt는 현재 다음 Jetpack 구성요소를 지원합니다.

  • Compose
  • ViewModel
  • 탐색
  • WorkManager

이러한 통합을 활용하려면 Hilt 종속 항목을 추가해야 합니다. 종속 항목 추가에 관한 자세한 내용은 Hilt를 사용한 종속 항목 삽입을 참고하세요.

Jetpack Compose와 통합

Hilt가 Jetpack Compose와 통합되는 방식은 Compose 및 기타 라이브러리의 Hilt 섹션을 참고하세요.

Hilt로 ViewModel 객체 삽입

ViewModel을(를) @HiltViewModel로 주석 처리하고 ViewModel 객체의 생성자에서 @Inject 주석을 사용하여 주석 처리 합니다.

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

ViewModel과 함께 지원되는 삽입 사용

Hilt는 ViewModel에 지원되는 삽입을 지원합니다. 지원되는 삽입을 사용하면 Hilt에서 관리하는 종속 항목과 함께 동적 런타임 인수를 삽입할 수 있습니다. 지원되는 삽입을 사용하려면 ViewModel 생성자에 @AssistedInject로 주석을 지정하고 동적 매개변수를 @Assisted로 표시합니다. 또한 Hilt가 필요한 @ViewModelProvider.Factory를 자동으로 생성하는 브리지 역할을 하는 @AssistedFactory 인터페이스를 정의해야 합니다.

@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

모든 Hilt ViewModel은 ViewModel과 동일한 수명 주기를 따르는 ViewModelComponent에서 제공되며, 따라서 구성 변경 후에도 유지될 수 있습니다. 종속 항목의 범위를 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")
}

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

Jetpack Compose에서 Navigation Compose 및 Navigation 3 라이브러리는 모두 hiltViewModel 함수를 사용하여 현재 탐색 대상으로 범위가 지정된 ViewModel을 자동으로 가져옵니다.

탐색 3에서 탐색 대상은 NavEntry로 표시됩니다. 를 사용하여 ViewModel의 범위를 NavEntrys로 지정합니다 rememberViewModelStoreNavEntryDecorator. 해당 NavEntry의 프로바이더 내에서 hiltViewModel을 사용하여 연결된 ViewModel을 가져옵니다.

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

탐색 Compose에서 ViewModel은 탐색 대상으로 자동으로 범위가 지정됩니다. 자세한 내용은 Hilt 및 탐색을 참고하세요.

val viewModel = hiltViewModel()

Hilt로 WorkManager 삽입

Gradle 파일에 다음과 같은 종속 항목을 추가합니다. 라이브러리 외에도 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")
}

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.3.0'
}

클래스의 Worker 주석과 @AssistedInject 객체의 생성자의 Worker 를 사용하여 @HiltWorker를 삽입합니다. Worker 객체에는 @Singleton 또는 범위가 지정되지 않은 결합만 사용할 수 있습니다. 또한 다음과 같이 ContextWorkerParameters 종속 항목에 @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()
}