Migration von Dagger2 zu Hilt in einem Projekt mit mehreren Modulen
Eine Schritt-für-Schritt-Anleitung für die Migration von Dagger
zu Hilt
in einem Projekt mit mehreren Modulen.
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
, Hilt
aber in der Praxis benötigen wir einen inkrementellen Ansatz, bei dem wir zuerst unser app
Projekt Hilt
und dann andere Module migrieren, das heißt, Dagger
und Hilt
sollten einige Zeit parallel arbeiten, bis die vollständige Migration abgeschlossen ist.
Versionen
Dagger 2.24
Diese 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 Hilt
die folgenden Abhängigkeiten in build.gradle
die Datei von App Gradle ein
Konfigurieren Sie außerdem kapt
, dass „correctErrorType“ auf true
„in build.gradle
file“ 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
Component
alle Dagger-Module, die in der App oder anderen Modulen des Projekts erstellt wurden, und das erfolgt normalerweise in der AppComponent
fü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
Component
installieren . 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 .SingletonComponent
Hilt
@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 Hilt
versucht das Projekt @InstallIn
, Annotationen für jedes Modul zu finden, das in AggregatedModule
annotated with enthalten ist @Module
. Hilt
löst einen Fehler aus, wenn ein Modul gefunden wird, das nicht mit annotiert ist. @Install
Da wir nicht jedes Modul mit annotiert haben, @InstallIn
da 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.gradle
wie 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 Application
Klasse mit @HiltAndroidApp
. Sie sollten @Component
und entfernen @Component.Builder
, die wie oben erwähnt im Unterricht vorhanden waren AppComponent
.
Wenn Ihre Application
Erweiterung DaggerApplication
oder Implementierung HasAndroidInjector
erfolgt, müssen Sie in beiden Fällen immer noch Code beibehalten, wie unten gezeigt. Dies soll beide Dagger
und Hilt
parallel unterstützen, bis die gesamte Migration abgeschlossen ist.
Wenn Ihre Application
Erweiterungen aus DaggerApplication
Ihrer Anwendungsklasse so aussehen.
Und wenn Ihre Application
Geräte implementiert sind HasAndroidInjector
, muss Ihre Anwendung so aussehen
Sobald die gesamte Migration abgeschlossen ist, müssen Sie diesen Code aus Ihrer Application
Klasse entfernen und Ihr Code Application
sieht 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 @ContributesAndroidInjector
die Möglichkeit, jede Aktivität/Fragment als Mitwirkenden für Android Injector anzugeben, in unserem Projekt, das in , MainActivityModule
einem der enthaltenen Module, durchgeführt wurdeAggregatedModule
MainActivityModule
sieht vor der Migration so aus
MainActivity
sieht vor der Migration so aus
Um unsere MainActivity
nach zu migrieren, werden wir die Modulklasse Hilt
vollstä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
@AndroidEntryPoint
MainActivity
MainActivity
DaggerAppCompatActivity
AppCompatActivity
MainActivity
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 Hilt
erfolgt mit den gleichen Schritten wie bei der Migration MainActivity
nach Hilt. Die Schritte sind unten aufgeführt
- Entfernen Sie den Code dort, wo Sie Ihr Fragment mit Anmerkungen versehen, da
@ContributesAndroidInjector
es sich wahrscheinlich um ein Modul handelt - Entfernen Sie das Modul, aus dem Ihr Fragment
SingletonComponent
verarbeitet wurde@ContributesAndroidInjector
- Kommentieren Sie Ihr Fragment mit
@AndroidEntryPoint
- Wenn Ihr Fragment erweitert wird,
DaggerFragment
müssen Sie Ihr Fragment von derFragment
Klasse erweitern
ViewModel migrieren
Für die Migration von ViewModel sind einige Schritte erforderlich.
Kommentieren Sie zunächst Ihr viewModel mit@HiltViewModel
Um FeatureViewModel
injiziert zu werden, Hilt
verwenden wir die Fragmenterweiterung, viewModels()
die in der Fragmenterweiterungsabhängigkeit bereitgestellt wird und die wir build.gradle
wie unten in der entsprechenden Datei hinzufügen
implementation "androidx.fragment:fragment-ktx:1.5.6"
Entfernen Sie nun die entsprechenden @Bind
, @IntoMap
und @ViewModelKey
Bindungen, FeatureViewModel
die wir für Dagger verwendet haben.
Um ein ViewModel in Dagger einzufügen, verfügen wir auch über lateinit var
Eigenschaften, die injected
zur Laufzeit verwendet werden und einige ViewModelFactory
nicht mehr benötigen. Sie können also ViewModelModule
, ViewModelProviderFactory
und 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
/ Fragment
im 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
- Fügen Sie
Hilt
derbuild.gradle
Datei des Moduls eine Abhängigkeit hinzu - Kommentieren Sie jeweils eine
@Module
Anmerkung@InstallIn
. - Entfernen Sie gegebenenfalls
@JvmStatic
die Anmerkung für jede@Provide
Anmerkung, da sie in nicht mehr benötigt wirdHilt
- Kommentieren Sie Ihr
Fragment
/Activity
mit@AndroidEntryPoint
und entfernen Sie das entsprechende@ContributesAndroidInjector
- Migrieren Sie Ihre ViewModels mit Anmerkungen
@HiltViewModel
und verwenden Sie die FragmenterweiterungviewModels()
, um diese Ansichtsmodelle einzufügen - 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
- Entfernen Sie „disableModuleInstallInCheck = true“, das wir zu Beginn auf App-Ebene oder auf einer anderen Ebene hinzugefügt haben,
build.gradle
und entfernen Sie@DisableInstallInCheck
Anmerkungen, falls sie zu einer hinzugefügt wurden@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Entfernen Sie alle Dagger
Abhä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
- Alle Codeanmerkungen
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
wären entfernt worden - Alle Ihre ViewModels müssen mit Anmerkungen versehen sein
@HiltViewModel
- Alle
@Module
Klassen müssen mit@InstallIn
Anmerkungen versehen sein - Fragmente/Aktivitäten/Ansichten/Dienste müssen mit Anmerkungen versehen werden
@AndroidEntryPoint
- Die Anwendungsklasse muss mit annotiert werden
@HiltAndroidApp
AppComponent
und zugehöriger Code müssen entfernt werden@JvmStatic
Anmerkungen 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