Migration von Dagger2 zu Hilt in einem Projekt mit mehreren Modulen

May 10 2023
Eine Schritt-für-Schritt-Anleitung für die Migration von Dagger zu Hilt in einem Projekt mit mehreren Modulen. Projektstruktur Zur Visualisierung des Projekts enthält es mehrere Module: NetworkModule, StorageModule, CommonModule, FeatureModule usw.

Eine Schritt-für-Schritt-Anleitung für die Migration von Daggerzu Hiltin einem Projekt mit mehreren Modulen.

Foto von Saif71.com auf Unsplash

Projektstruktur

Um das Projekt zu visualisieren, enthält es mehrere Module: NetworkModule, StorageModule, CommonModule, FeatureModule usw. In realen Projekten könnte es noch viel mehr Module geben, wir beschränken uns jedoch auf die folgenden Module.

Migrationsstrategie

Wir möchten vollständig migrieren Dagger, Hiltaber in der Praxis benötigen wir einen inkrementellen Ansatz, bei dem wir zuerst unser appProjekt Hiltund dann andere Module migrieren, das heißt, Daggerund Hiltsollten einige Zeit parallel arbeiten, bis die vollständige Migration abgeschlossen ist.

Versionen

Dagger 2.24Diese Geschichte wird eine Migration von nach durchführen Hilt 2.45.

Inhalt

  • Konfiguration/Vorbereitung
  • App-Komponente und Singleton migrieren
  • Anwendungsklasse migrieren
  • Aktivitätsklasse migrieren
  • Fragment migrieren
  • ViewModel migrieren
  • Bereinigung nach der Migration
  • Zusammenfassung und Imbissbuden

Fügen Sie zur Integration Hiltdie folgenden Abhängigkeiten in build.gradledie Datei von App Gradle ein

Konfigurieren Sie außerdem kapt, dass „correctErrorType“ auf true„in build.gradlefile“ festgelegt ist

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 {
    ....
}

App-Komponente migrieren

Dagger enthält Singleton Componentalle Dagger-Module, die in der App oder anderen Modulen des Projekts erstellt wurden, und das erfolgt normalerweise in der AppComponentfür erstellten Klasse Dagger.

Schauen wir uns die aktuelle AppComponent.kt- Datei an

Um zu migrieren, müssen wir jedes Modul, z. B. NetworkModule , StorageModule usw., in for Singleton Componentinstallieren . Sie können dies tun, indem Sie alle einzelnen Module mit Anmerkungen versehen. Wenn Sie jedoch viele Module haben, ist es keine gute Idee, alle auf einmal zu ändern, aber Sie können es tun Erstellen Sie ein AggregatedModule , das mit annotiert wird und alle mit annotierten Module enthält .SingletonComponentHilt@InstallIn(SingletonComponent::class)@InstallIn(SingletonComponent::class)Dagger@Module(includes = [ <all of these modules > ])

Führen Sie das Projekt aus, es wird ein Fehler ausgegeben

DisableModuleHasInstallInCheck-Fehler

Nach der Ausführung Hiltversucht das Projekt @InstallIn, Annotationen für jedes Modul zu finden, das in AggregatedModuleannotated with enthalten ist @Module. Hiltlöst einen Fehler aus, wenn ein Modul gefunden wird, das nicht mit annotiert ist. @InstallDa wir nicht jedes Modul mit annotiert haben, @InstallInda wir uns mitten in der Migration befinden, können wir diesen Fehler mit dem folgenden Flag deaktivieren

-Adagger.hilt.disableModulesHaveInstallInCheck=true.

Sie können auf App-Ebene build.gradlewie folgt angeben, wir sollten dieses Flag jedoch entfernen, sobald die gesamte Migration abgeschlossen ist.

defaultConfig {
   
    //TODO: remove this after migration to Hilt
    javaCompileOptions {
        annotationProcessorOptions {
            arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
        }
    }
}

Anwendungsklasse migrieren

Um Hilt zur Anwendung hinzuzufügen, kommentieren wir die ApplicationKlasse mit @HiltAndroidApp. Sie sollten @Componentund entfernen @Component.Builder, die wie oben erwähnt im Unterricht vorhanden waren AppComponent.

Wenn Ihre ApplicationErweiterung DaggerApplicationoder Implementierung HasAndroidInjectorerfolgt, müssen Sie in beiden Fällen immer noch Code beibehalten, wie unten gezeigt. Dies soll beide Daggerund Hiltparallel unterstützen, bis die gesamte Migration abgeschlossen ist.

Wenn Ihre ApplicationErweiterungen aus DaggerApplicationIhrer Anwendungsklasse so aussehen.

Und wenn Ihre ApplicationGeräte implementiert sind HasAndroidInjector, muss Ihre Anwendung so aussehen

Sobald die gesamte Migration abgeschlossen ist, müssen Sie diesen Code aus Ihrer ApplicationKlasse entfernen und Ihr Code Applicationsieht dann wie folgt aus. (Aber das wäre einer der letzten Schritte, bitte tun Sie es jetzt nicht)

Führen Sie das Projekt aus. Es sollte Ihr Projekt erfolgreich erstellen und die App muss ohne Laufzeitausnahmen gestartet werden.

Aktivitätsklasse migrieren

Dagger bietet @ContributesAndroidInjectordie Möglichkeit, jede Aktivität/Fragment als Mitwirkenden für Android Injector anzugeben, in unserem Projekt, das in , MainActivityModuleeinem der enthaltenen Module, durchgeführt wurdeAggregatedModule

MainActivityModulesieht vor der Migration so aus

MainActivitysieht vor der Migration so aus

Um unsere MainActivitynach zu migrieren, werden wir die Modulklasse Hiltvollständig entfernen und Anmerkungen für hinzufügen . Da sich auch unsere erweitert, müssen wir unsere Aktivität entsprechend erweitern, sodass unsere nach der Migration wie folgt aussehen wird.MainActivityModule@AndroidEntryPointMainActivityMainActivityDaggerAppCompatActivityAppCompatActivityMainActivity

MainActivity Führen Sie Ihr Projekt aus , in das es migriert werden sollte Hilt

Fragment/Ansicht/BroadcastReceiver migrieren

Die Migration eines beliebigen Fragments nach Hilt Hilterfolgt mit den gleichen Schritten wie bei der Migration MainActivitynach Hilt. Die Schritte sind unten aufgeführt

  1. Entfernen Sie den Code dort, wo Sie Ihr Fragment mit Anmerkungen versehen, da @ContributesAndroidInjectores sich wahrscheinlich um ein Modul handelt
  2. Entfernen Sie das Modul, aus dem Ihr Fragment SingletonComponentverarbeitet wurde@ContributesAndroidInjector
  3. Kommentieren Sie Ihr Fragment mit@AndroidEntryPoint
  4. Wenn Ihr Fragment erweitert wird, DaggerFragmentmüssen Sie Ihr Fragment von der FragmentKlasse erweitern

ViewModel migrieren

Für die Migration von ViewModel sind einige Schritte erforderlich.

Kommentieren Sie zunächst Ihr viewModel mit@HiltViewModel

Um FeatureViewModelinjiziert zu werden, Hiltverwenden wir die Fragmenterweiterung, viewModels()die in der Fragmenterweiterungsabhängigkeit bereitgestellt wird und die wir build.gradlewie unten in der entsprechenden Datei hinzufügen

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

Entfernen Sie nun die entsprechenden @Bind, @IntoMapund @ViewModelKeyBindungen, FeatureViewModeldie wir für Dagger verwendet haben.

Um ein ViewModel in Dagger einzufügen, verfügen wir auch über lateinit varEigenschaften, die injectedzur Laufzeit verwendet werden und einige ViewModelFactorynicht mehr benötigen. Sie können also ViewModelModule, ViewModelProviderFactoryund den zugehörigen Code löschen, wenn sich noch kein anderes ViewModel/Fragment in Dagger befindet.

Fragment and ViewModel Führen Sie Ihr Projekt aus , in das es migriert werden sollte Hilt

Andere Module migrieren.

Bisher haben wir Components/ Modules/ Activity/ Fragmentim App-Modul migriert. Aber wir müssen jetzt andere Module migrieren. Wir gehen ein Modul nach dem anderen durch und migrieren es mithilfe der folgenden Schritte vollständig zu Hilt

  1. Fügen Sie Hiltder build.gradleDatei des Moduls eine Abhängigkeit hinzu
  2. Kommentieren Sie jeweils eine @ModuleAnmerkung @InstallIn.
  3. Entfernen Sie gegebenenfalls @JvmStaticdie Anmerkung für jede @ProvideAnmerkung, da sie in nicht mehr benötigt wirdHilt
  4. Kommentieren Sie Ihr Fragment/ Activitymit @AndroidEntryPointund entfernen Sie das entsprechende@ContributesAndroidInjector
  5. Migrieren Sie Ihre ViewModels mit Anmerkungen @HiltViewModelund verwenden Sie die Fragmenterweiterung viewModels(), um diese Ansichtsmodelle einzufügen
  6. Entfernen Sie weiterhin alle Module, die in nicht mehr benötigt werden AggregatedModule. AggregatedModule Wir haben oben in unserem ersten Schritt erstellt.

Sobald jedes Projektmodul nach migriert ist Hilt. Zeit zum Aufräumen ist nötig

  1. Entfernen Sie „disableModuleInstallInCheck = true“, das wir zu Beginn auf App-Ebene oder auf einer anderen Ebene hinzugefügt haben, build.gradleund entfernen Sie @DisableInstallInCheckAnmerkungen, falls sie zu einer hinzugefügt wurden@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

4. Entfernen Sie alle DaggerAbhängigkeiten in allen Ihren Modulen.

Führen Sie Ihr Projekt aus. Es sollte erfolgreich ausgeführt werden. Ihr Projekt wurde vollständig in Hilt migriert

Zusammenfassung und Imbissbuden

Eine allgemeine Übersicht über die Codeänderungen nach der Migration sieht folgendermaßen aus

  1. Alle Codeanmerkungen @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeywären entfernt worden
  2. Alle Ihre ViewModels müssen mit Anmerkungen versehen sein@HiltViewModel
  3. Alle @ModuleKlassen müssen mit @InstallInAnmerkungen versehen sein
  4. Fragmente/Aktivitäten/Ansichten/Dienste müssen mit Anmerkungen versehen werden@AndroidEntryPoint
  5. Die Anwendungsklasse muss mit annotiert werden@HiltAndroidApp
  6. AppComponentund zugehöriger Code müssen entfernt werden
  7. @JvmStaticAnmerkungen innerhalb von Hilt-Modulen dürfen nicht mehr vorhanden sein
  • Abhängigkeitsinjektion mit Hilt
  • Migrieren Sie zur offiziellen Hilt-Dokumentation

Denken Sie daran, zu folgen und , wenn es Ihnen gefallen hat :)

— — — — — — — — — — —

GitHub | LinkedIn | Twitter

Level-Up-Codierung

Vielen Dank, dass Sie Teil unserer Community sind! Bevor du gehst:

  • Klatschen Sie für die Geschichte und folgen Sie dem Autor
  • Weitere Inhalte finden Sie in der Level Up Coding-Publikation
  • Kostenloser Programmier-Interviewkurs ⇒ Kurs ansehen
  • Folgen Sie uns: Twitter | LinkedIn | Newsletter