マルチモジュール プロジェクトで Dagger2 から Hilt に移行する

May 10 2023
マルチモジュール プロジェクトで Dagger から Hilt に移行するためのステップバイステップ ガイド。プロジェクトの構造 プロジェクトを視覚化するには、NetworkModule、StorageModule、CommonModule、FeatureModule などの複数のモジュールが含まれています。

マルチモジュール プロジェクトでからDaggerに移行するためのステップバイステップのガイド。Hilt

Unsplash の Saif71.com による写真

プロジェクトの構造

プロジェクトを視覚化するために、プロジェクトには NetworkModule、StorageModule、CommonModule、FeatureModule などの複数のモジュールが含まれています。実際のプロジェクトではさらに多くのモジュールが存在する可能性がありますが、以下のモジュールに限定しています。

移行戦略

Daggerに完全に移行したいと考えていますHiltが、実際には、最初にappプロジェクトを に移行しHilt、次に他のモジュールに移行する増分アプローチが必要です。つまり、完全な移行が完了するまで、しばらく並行して作業する必要がありますDaggerHilt

バージョン

Dagger 2.24このストーリーでは、から への移行を行いますHilt 2.45

コンテンツ

  • 設定・準備
  • アプリコンポーネントとシングルトンを移行する
  • アプリケーションクラスの移行
  • アクティビティクラスの移行
  • フラグメントの移行
  • ViewModel の移行
  • 移行後のクリーンアップ
  • 要約と要点

統合するには、Hilt次の依存関係をアプリ Gradle のbuild.gradleファイルに追加します。

ファイルにkapt正しいErrorTypeを設定するようにも設定しますtruebuild.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ファイルを見てみましょう

移行するには、 NetworkModuleStorageModuleなどの各モジュールをforにSingleton Componentインストールする必要があります。これらの個々のモジュールすべてに 注釈 を付けることでこれを行うことができます。ただし、モジュールが多数ある場合は、それらすべてを一度に変更するのは良い考えではありませんが、代わりに次のようにすることができます。で注釈が付けられ、 で注釈が付けられたこれらすべてのモジュールを含むAggregatedModuleを作成します。SingletonComponentHilt@InstallIn(SingletonComponent::class)@InstallIn(SingletonComponent::class)Dagger@Module(includes = [ <all of these modules > ])

プロジェクトを実行すると、エラーが発生します

DisableModuleHasInstallInCheck エラー

実行後、プロジェクトは で注釈が付けられたモジュールに含まれる各モジュールの注釈Hiltを検索しようとします。注釈が付けられていないモジュールが見つかった場合はエラーが発生します。移行の途中であるため、すべてのモジュールに注釈を付けていないため、次のフラグを使用してこのエラーを無効にできます。@InstallInAggregatedModule@ModuleHilt@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.BuilderAppComponent

Applicationから拡張するDaggerApplicationか実装する場合は、HasAndroidInjectorどちらの場合でも、以下に示すようにコードを保持する必要があります。これは、移行全体が完了するまで両方Daggerを並行してサポートするためです。Hilt

アプリケーションクラスApplicationから拡張すると、次のようになります。DaggerApplication

そして、Application実装する場合HasAndroidInjector、アプリケーションは次のようになっている必要があります

移行全体が完了したら、そのようなコードをクラスから削除する必要があります。ApplicationコードはApplication以下のようになります。(ただし、これは最後のステップの 1 つです。今は行わないでください)

プロジェクトを実行すると、プロジェクトが正常にビルドされ、ランタイム例外なくアプリが起動する必要があります。

アクティビティクラスの移行

Dagger は、に含まれるモジュールの 1 つである@ContributesAndroidInjectorで行われたプロジェクトで、Android インジェクターのコントリビューターとしてアクティビティ/フラグメントを指定することを提供します。MainActivityModuleAggregatedModule

MainActivityModule移行前はこんな感じ

MainActivity移行前はこんな感じ

MainActivityを に移行するには、モジュール クラスをHilt完全に削除し、のアノテーションを追加します。私たちのアクティビティも対応するものから拡張する必要があるため、移行後は以下のようになります。MainActivityModule@AndroidEntryPointMainActivityMainActivityDaggerAppCompatActivityAppCompatActivityMainActivity

MainActivityに移行すると成功するはずのプロジェクトを実行しますHilt

フラグメント/ビュー/BroadcastReceiver の移行

フラグメントの移行は、 Hilt へのHilt移行と同じ手順で行われますMainActivity。手順は以下の通りです

  1. @ContributesAndroidInjectorモジュールである可能性が高いフラグメントに注釈を付けているコードを削除します
  2. フラグメントをSingletonComponent処理していたモジュールを削除します@ContributesAndroidInjector
  3. フラグメントに注釈を付ける@AndroidEntryPoint
  4. フラグメントがクラスから拡張されている場合は、クラスDaggerFragmentからフラグメントを拡張する必要がありますFragment

ViewModel の移行

ViewModel の移行にはいくつかの手順が必要です。

まず viewModel に注釈を付けます@HiltViewModel

FeatureViewModel挿入するには、フラグメント拡張子の依存関係で提供されるHiltフラグメント拡張子を使用します。これを以下のようにviewModels()対応するファイルに追加します。build.gradle

implementation "androidx.fragment:fragment-ktx:1.5.6"

ここで、Dagger に使用した対応する@Bindとバインディングを@IntoMap削除します。@ViewModelKeyFeatureViewModel

ViewModel を挿入するための Dagger には、実行時に使用されるlateinit varプロパティもあり、これも不要になったので、Dagger に他の ViewModel/Fragment がまだない場合は、 および関連するコードを削除できます。injectedViewModelFactoryViewModelModuleViewModelProviderFactory

Fragment and ViewModelに移行すると成功するはずのプロジェクトを実行しますHilt

他のモジュールを移行します。

これまでは、アプリ モジュール内でComponents/ Modules/ Activity/を移行していました。Fragmentただし、ここで他のモジュールを移行する必要があります。次の手順を使用して、一度に 1 つのモジュールを移動して Hilt に完全に移行します。

  1. モジュールのファイルHiltに依存関係を追加します。build.gradle
  2. それぞれ@Module@InstallIn注釈を付けます。
  3. 注釈がある場合は、不要になったので、@JvmStatic各注釈を削除します。@ProvideHilt
  4. Fragment/Activityに注釈を付けて@AndroidEntryPoint、対応するものを削除します@ContributesAndroidInjector
  5. アノテーションを付けた ViewModel を移行し@HiltViewModel、フラグメント拡張機能を使用してviewModels()それらの ViewModel を注入します
  6. で不要になったモジュールをすべて削除し続けますAggregatedModuleAggregatedModule 最初のステップで上記のように作成しました。

各プロジェクト モジュールが に移行されるとHilt、掃除の時間が必要

  1. 最初にアプリレベルまたはその他のレベルで追加した disableModuleInstallInCheck = true を削除し、build.gradleアノテーション@DisableInstallInCheckが追加されている場合は削除します。@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

4.Daggerすべてのモジュールのすべての依存関係を削除します。

プロジェクトを実行すると、プロジェクトが完全に移行されて正常に実行されるはずですHilt

要約と要点

移行後のコード変更の概要は次のようになります。

  1. コードの注釈はすべて@Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/@ViewModelKey削除されます
  2. すべての ViewModel に次の注釈を付ける必要があります@HiltViewModel
  3. すべてのクラスにはアノテーション@Moduleを付ける必要があります@InstallIn
  4. フラグメント/アクティビティ/ビュー/サービスには次の注釈を付ける必要があります@AndroidEntryPoint
  5. アプリケーションクラスには次の注釈を付ける必要があります@HiltAndroidApp
  6. AppComponent関連するコードを削除する必要があります
  7. @JvmStaticHilt モジュール内のアノテーションはもう存在してはなりません
  • Hilt を使用した依存関係の注入
  • Hilt 公式ドキュメントへの移行

気に入ったら忘れずにフォローして :)

— — — — — — — — — — —

ギットハブ| リンクトイン| ツイッター

レベルアップコーディング

コミュニティにご参加いただきありがとうございます。出発する前に:

  • ストーリーに拍手を送り、著者をフォローしてください
  • 『レベルアップコーディング』出版物でさらにコンテンツを表示
  • 無料コーディング面接コース ⇒コースを見る
  • フォローしてください: Twitter | リンクトイン| ニュースレター