Infinito Nirone 7

白羽の矢を刺すスタイル

Hilt 1.0.0 へのマイグレーション

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.34: @ViewModelInject の置き換え

@ViewModelInject が廃止され、@HiltViewModel に置き換わりました。これにともなって、コンストラクタに @Inject アノテーションをつける必要があります。

@HiltViewModel // @ViewModelInject ではなく @HiltViewModel を使い、コンストラクタに @Inject をつける
class SampleViewModel @Inject constructor(
  ...
) : ViewModel()

Dagger Hilt 2.34: SavedStateHandle のための @Assisted の削除

ViewModelSavedStateHandle を 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#getContextFragment が削除されたあとでも Context インスタンスを返します。