Google I/O 2021 で Hilt がついに安定版に到達し、1.0.0 がリリースとなったことが告知されました。
この記事を執筆時点で Dagger Hilt および AndroidX Hilt の最新版は次のとおりです。
Dagger Hilt: 2.36 AndroidX Hilt: 1.0.0
それぞれにコンポーネントがあり別々のバージョン番号があるので少し分かりづらい状況になっていますが、少なくとも Hilt が安定版となったのは Dagger Hilt 2.35 からであることに特に注意します。
バージョンアップにともなうマイグレーション作業
ここでは主に Dagger Hilt 2.34 より前からのマイグレーション作業にフォーカスして記述します。
- Dagger Hilt 2.36 のリリースノートにある Breaking Change とマイグレーション作業の記述: https://github.com/google/dagger/releases/tag/dagger-2.36
- Dagger Hilt 2.34 のリリースノートにある Breaking Change とマイグレーション作業の記述: https://github.com/google/dagger/releases/tag/dagger-2.34
Dagger Hilt 2.34: @ViewModelInject
の置き換え
@ViewModelInject
が廃止され、@HiltViewModel
に置き換わりました。これにともなって、コンストラクタに @Inject
アノテーションをつける必要があります。
@HiltViewModel // @ViewModelInject ではなく @HiltViewModel を使い、コンストラクタに @Inject をつける class SampleViewModel @Inject constructor( ... ) : ViewModel()
Dagger Hilt 2.34: SavedStateHandle
のための @Assisted
の削除
ViewModel
に SavedStateHandle
を inject するために利用していた @Assisted
が不要になりました。単純に削除するだけで OK です。
@HiltViewModel class SampleViewModel @Inject constructor( ... savedStateHandle: SavedStateHandle, // @Assisted を消す ) : ViewModel()
Dagger Hilt 2.34: androidx.hilt:hilt-lifecycle-viewmodel
への依存の削除
AndroidX Hilt には ViewModel 対応のためのアーティファクトとして androidx.hilt:hilt-lifecycle-viewmodel
が用意されていますが、安定版では必要ないため削除します。Google Maven Repository には 1.0.0-alpha-03 までのバージョンがアップロードされていますが、純粋に必要なくなったため 1.0.0 のリリースはありません。依存を削除しましょう。
(AndroidX Hilt 側のリリースノートではなく Dagger Hilt 側のリリースノートに記述があるためすこし紛らわしいですが…… twitter を検索すると gerrit code review で androidx.hilt:hilt-lifecycle-viewmodel
への依存を切るための差分がサブミットされている様子も見つかります。)
Dagger Hilt 2.36: Fragment#getContext
の振る舞いの修正
これまで、Hilt において Fragment#getContext
がうっかり Framgent が削除されたあとでもContext
インスタンスを返していました。これは通常の Fragment
とは異なる動きであり、通常の Fragment
のように振る舞うことが本来の動作であったため、2.36 で修正が入ります。ただし、この修正には相当のインパクトが見込まれるため、
-Adagger.hilt.android.useFragmentGetContextFix=true
をつかって feature flag を有効にしない限り、2.36 でも以前のバージョンと同じく Hilt の Fragment#getContext
は Fragment
が削除されたあとでも Context
インスタンスを返します。