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 ファイルに次のように依存関係を追加します。
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 アノテーション プロセッサ上で動作するアノテーション プロセッサを追加する必要があります。
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(); } }