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

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

  • ViewModel
  • ナビゲーション
  • Compose
  • WorkManager

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

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

ViewModel を指定するには、@HiltViewModel アノテーションを付け、ViewModel オブジェクトのコンストラクタで @Inject アノテーションを使用します。

Kotlin

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

Java

@HiltViewModel
public class ExampleViewModel extends ViewModel {

  private final ExampleRepository repository;
  private final SavedStateHandle savedStateHandle;

  @Inject
  ExampleViewModel(
      SavedStateHandle savedStateHandle,
      ExampleRepository repository)
    {
    this.savedStateHandle = savedStateHandle;
    this.repository = repository;
  }
  ...
}

すると、@AndroidEntryPoint アノテーションが付けられたアクティビティまたはフラグメントは、ViewModelProvider または by viewModels() KTX 拡張機能を使用して、通常どおりに ViewModel インスタンスを取得できるようになります。

Kotlin

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

Java

@AndroidEntryPoint
public class ExampleActivity extends AppCompatActivity {

  private ExampleViewModel exampleViewModel;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class);
  }
  ...
}

@ViewModelScoped

すべての Hilt ViewModel は、ViewModelComponent によって提供され、ViewModel と同じライフサイクルに従うため、構成変更後も存続できます。依存関係のスコープを ViewModel にするには、@ViewModelScoped アノテーションを使用します。

@ViewModelScoped 型を使用すると、ViewModel に注入されたすべての依存関係にスコープ設定されている型の単一インスタンスが提供されます。スコープ設定されているインスタンスをリクエストする ViewModel の他のインスタンスは、別のインスタンスを受け取ります。

単一のインスタンスをさまざまな ViewModel で共有する必要がある場合は、@ActivityRetainedScoped または @Singleton を使用してスコープ設定してください。

Jetpack ナビゲーション ライブラリと統合する

Gradle ファイルに次のように依存関係を追加します。

app/build.gradle

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}

ViewModelナビゲーション グラフにスコープ設定されている場合は、@AndroidEntryPoint アノテーションが付けられたフラグメントで機能する hiltNavGraphViewModels 関数を使用します。

Kotlin

val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)

Java

NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph);

ExampleViewModel exampleViewModel = new ViewModelProvider(
  backStackEntry,
  HiltViewModelFactory.create(context, backStackEntry)
).get(ExampleViewModel.class)

Jetpack Compose と統合する

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

Hilt を使用して WorkManager を注入する

Gradle ファイルに次の依存関係を追加します。ライブラリに加えて、Hilt アノテーション プロセッサ上で動作するアノテーション プロセッサを追加する必要があります。

app/build.gradle

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  kapt 'androidx.hilt:hilt-compiler:1.0.0'
  // When using Java.
  annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0'
}

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    // When using Java.
    annotationProcessor("androidx.hilt:hilt-compiler:1.0.0")
}

クラスで @HiltWorker アノテーションを使用し、Worker オブジェクトのコンストラクタで @AssistedInject を使用して、Worker を注入します。Worker オブジェクトでは、@Singleton またはスコープ設定されていないバインディングのみが使用できます。Context 依存関係と WorkerParameters 依存関係に @Assisted アノテーションを付ける必要もあります。

Kotlin

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

Java

@HiltWorker
public class ExampleWorker extends Worker {

  private final WorkerDependency workerDependency;

  @AssistedInject
  ExampleWorker(
    @Assisted @NonNull Context context,
    @Assisted @NonNull WorkerParameters params,
    WorkerDependency workerDependency
  ) {
    super(context, params);
    this.workerDependency = workerDependency;
  }
  ...
}

そして、次のように、Application クラスで Configuration.Provider インターフェースを実装し、HiltWorkFactory のインスタンスを注入して、WorkManager 設定に渡します。

Kotlin

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}

Java

@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {

  @Inject HiltWorkerFactory workerFactory;

  @Override
  public Configuration getWorkManagerConfiguration() {
    return new Configuration.Builder()
             .setWorkerFactory(workerFactory)
             .build();
  }
}