マルチモジュール プロジェクトで Dagger2 から Hilt に移行する
マルチモジュール プロジェクトでからDagger
に移行するためのステップバイステップのガイド。Hilt
プロジェクトの構造
プロジェクトを視覚化するために、プロジェクトには NetworkModule、StorageModule、CommonModule、FeatureModule などの複数のモジュールが含まれています。実際のプロジェクトではさらに多くのモジュールが存在する可能性がありますが、以下のモジュールに限定しています。
移行戦略
Dagger
に完全に移行したいと考えていますHilt
が、実際には、最初にapp
プロジェクトを に移行しHilt
、次に他のモジュールに移行する増分アプローチが必要です。つまり、完全な移行が完了するまで、しばらく並行して作業する必要がありますDagger
。Hilt
バージョン
Dagger 2.24
このストーリーでは、から への移行を行いますHilt 2.45
。
コンテンツ
- 設定・準備
- アプリコンポーネントとシングルトンを移行する
- アプリケーションクラスの移行
- アクティビティクラスの移行
- フラグメントの移行
- ViewModel の移行
- 移行後のクリーンアップ
- 要約と要点
統合するには、Hilt
次の依存関係をアプリ Gradle のbuild.gradle
ファイルに追加します。
ファイルにkapt
正しいErrorTypeを設定するようにも設定しますtrue
build.gradle
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
アプリコンポーネントの移行
Dagger には、Singleton
Component
アプリまたはプロジェクトの他のモジュールで作成されたすべての Dagger モジュールが含まれており、これは通常、AppComponent
用に作成されたクラスで行われますDagger
。
現在のAppComponent.ktファイルを見てみましょう
移行するには、 NetworkModule、StorageModuleなどの各モジュールをforにSingleton
Component
インストールする必要があります。これらの個々のモジュールすべてに 注釈 を付けることでこれを行うことができます。ただし、モジュールが多数ある場合は、それらすべてを一度に変更するのは良い考えではありませんが、代わりに次のようにすることができます。で注釈が付けられ、 で注釈が付けられたこれらすべてのモジュールを含むAggregatedModuleを作成します。SingletonComponent
Hilt
@InstallIn(SingletonComponent::class)
@InstallIn(SingletonComponent::class)
Dagger
@Module(includes = [ <all of these modules > ])
プロジェクトを実行すると、エラーが発生します
DisableModuleHasInstallInCheck エラー
実行後、プロジェクトは で注釈が付けられたモジュールに含まれる各モジュールの注釈Hilt
を検索しようとします。注釈が付けられていないモジュールが見つかった場合はエラーが発生します。移行の途中であるため、すべてのモジュールに注釈を付けていないため、次のフラグを使用してこのエラーを無効にできます。@InstallIn
AggregatedModule
@Module
Hilt
@Install
@InstallIn
-Adagger.hilt.disableModulesHaveInstallInCheck=true
。
以下のようにアプリレベルで指定できますbuild.gradle
が、すべての移行が完了したらこのフラグを削除する必要があります。
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
アプリケーションクラスの移行
Hilt をアプリケーションに追加するには、Application
クラスに の注釈を付けましょう@HiltAndroidApp
。上で述べたように、クラスに存在していた と@Component
を削除する必要があります。@Component.Builder
AppComponent
Application
から拡張するDaggerApplication
か実装する場合は、HasAndroidInjector
どちらの場合でも、以下に示すようにコードを保持する必要があります。これは、移行全体が完了するまで両方Dagger
を並行してサポートするためです。Hilt
アプリケーションクラスApplication
から拡張すると、次のようになります。DaggerApplication
そして、Application
実装する場合HasAndroidInjector
、アプリケーションは次のようになっている必要があります
移行全体が完了したら、そのようなコードをクラスから削除する必要があります。Application
コードはApplication
以下のようになります。(ただし、これは最後のステップの 1 つです。今は行わないでください)
プロジェクトを実行すると、プロジェクトが正常にビルドされ、ランタイム例外なくアプリが起動する必要があります。
アクティビティクラスの移行
Dagger は、に含まれるモジュールの 1 つである@ContributesAndroidInjector
で行われたプロジェクトで、Android インジェクターのコントリビューターとしてアクティビティ/フラグメントを指定することを提供します。MainActivityModule
AggregatedModule
MainActivityModule
移行前はこんな感じ
MainActivity
移行前はこんな感じ
MainActivity
を に移行するには、モジュール クラスをHilt
完全に削除し、のアノテーションを追加します。私たちのアクティビティも対応するものから拡張する必要があるため、移行後は以下のようになります。MainActivityModule
@AndroidEntryPoint
MainActivity
MainActivity
DaggerAppCompatActivity
AppCompatActivity
MainActivity
MainActivity
に移行すると成功するはずのプロジェクトを実行しますHilt
フラグメント/ビュー/BroadcastReceiver の移行
フラグメントの移行は、 Hilt へのHilt
移行と同じ手順で行われますMainActivity
。手順は以下の通りです
@ContributesAndroidInjector
モジュールである可能性が高いフラグメントに注釈を付けているコードを削除します- フラグメントを
SingletonComponent
処理していたモジュールを削除します@ContributesAndroidInjector
- フラグメントに注釈を付ける
@AndroidEntryPoint
- フラグメントがクラスから拡張されている場合は、クラス
DaggerFragment
からフラグメントを拡張する必要がありますFragment
ViewModel の移行
ViewModel の移行にはいくつかの手順が必要です。
まず viewModel に注釈を付けます@HiltViewModel
FeatureViewModel
挿入するには、フラグメント拡張子の依存関係で提供されるHilt
フラグメント拡張子を使用します。これを以下のようにviewModels()
対応するファイルに追加します。build.gradle
implementation "androidx.fragment:fragment-ktx:1.5.6"
ここで、Dagger に使用した対応する@Bind
とバインディングを@IntoMap
削除します。@ViewModelKey
FeatureViewModel
ViewModel を挿入するための Dagger には、実行時に使用されるlateinit var
プロパティもあり、これも不要になったので、Dagger に他の ViewModel/Fragment がまだない場合は、 および関連するコードを削除できます。injected
ViewModelFactory
ViewModelModule
ViewModelProviderFactory
Fragment and ViewModel
に移行すると成功するはずのプロジェクトを実行しますHilt
他のモジュールを移行します。
これまでは、アプリ モジュール内でComponents
/ Modules
/ Activity
/を移行していました。Fragment
ただし、ここで他のモジュールを移行する必要があります。次の手順を使用して、一度に 1 つのモジュールを移動して Hilt に完全に移行します。
- モジュールのファイル
Hilt
に依存関係を追加します。build.gradle
- それぞれ
@Module
に@InstallIn
注釈を付けます。 - 注釈がある場合は、不要になったので、
@JvmStatic
各注釈を削除します。@Provide
Hilt
Fragment
/Activity
に注釈を付けて@AndroidEntryPoint
、対応するものを削除します@ContributesAndroidInjector
- アノテーションを付けた ViewModel を移行し
@HiltViewModel
、フラグメント拡張機能を使用してviewModels()
それらの ViewModel を注入します - で不要になったモジュールをすべて削除し続けます
AggregatedModule
。AggregatedModule
最初のステップで上記のように作成しました。
各プロジェクト モジュールが に移行されるとHilt
、掃除の時間が必要
- 最初にアプリレベルまたはその他のレベルで追加した disableModuleInstallInCheck = true を削除し、
build.gradle
アノテーション@DisableInstallInCheck
が追加されている場合は削除します。@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4.Dagger
すべてのモジュールのすべての依存関係を削除します。
プロジェクトを実行すると、プロジェクトが完全に移行されて正常に実行されるはずですHilt
要約と要点
移行後のコード変更の概要は次のようになります。
- コードの注釈はすべて
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
削除されます - すべての ViewModel に次の注釈を付ける必要があります
@HiltViewModel
- すべてのクラスにはアノテーション
@Module
を付ける必要があります@InstallIn
- フラグメント/アクティビティ/ビュー/サービスには次の注釈を付ける必要があります
@AndroidEntryPoint
- アプリケーションクラスには次の注釈を付ける必要があります
@HiltAndroidApp
AppComponent
関連するコードを削除する必要があります@JvmStatic
Hilt モジュール内のアノテーションはもう存在してはなりません
- Hilt を使用した依存関係の注入
- Hilt 公式ドキュメントへの移行
気に入ったら忘れずにフォローして :)
— — — — — — — — — — —
ギットハブ| リンクトイン| ツイッター
レベルアップコーディング
コミュニティにご参加いただきありがとうございます。出発する前に:
- ストーリーに拍手を送り、著者をフォローしてください
- 『レベルアップコーディング』出版物でさらにコンテンツを表示
- 無料コーディング面接コース ⇒コースを見る
- フォローしてください: Twitter | リンクトイン| ニュースレター