他の Jetpack ライブラリで Hilt を使用する

Hilt には、他の Jetpack ライブラリからクラスを提供するための拡張機能が用意されています。 Hilt で現在サポートされている Jetpack コンポーネントは次のとおりです。

  • 作成
  • ViewModel
  • ナビゲーション
  • WorkManager

この統合を利用するには、Hilt 依存関係を追加する必要があります。依存関係の追加について詳しくは、Hilt を使用した依存関係の注入をご覧ください。

Jetpack Compose と統合する

Hilt と Jetpack Compose の統合については、Compose とその他のライブラリの Hilt セクションをご覧ください。

Hilt を使用して ViewModel オブジェクトを注入する

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

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 関数に渡すことで、アシスト Factory を使用できます。この方法では、ViewModel を Navigation バックスタックに正しくスコープ設定したまま、手動で Factory のボイラープレートを作成する必要がなくなります。詳細については、 アシスト注入に関する Hilt のドキュメントをご覧ください。

@ViewModelScoped

すべての Hilt ViewModel は、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")
}

Groovy

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 を使用します。その NavEntry のプロバイダ内で hiltViewModel を使用して、関連付けられた ViewModel を取得します。

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

Navigation 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'
}

クラスで @HiltWorker アノテーションを使用し、@AssistedInjectWorker オブジェクトのコンストラクタで使用して、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()
}