Migrer de Dagger2 vers Hilt dans un projet multi-modules
Un guide étape par étape pour migrer de Dagger
vers Hilt
dans un projet multi-modules.
Structure du projet
Pour visualiser le projet, il contient plusieurs modules NetworkModule, StorageModule, CommonModule, FeatureModule etc. Dans les projets réels, il pourrait y avoir beaucoup plus de modules mais nous nous limitons aux modules suivants.
Stratégie migratoire
Nous voulons migrer complètement Dagger
vers, Hilt
mais en pratique, nous avons besoin d'une approche incrémentielle où nous allons d'abord migrer notre app
projet vers Hilt
, puis d'autres modules, ce qui signifie Dagger
et Hilt
devrait fonctionner en parallèle pendant un certain temps jusqu'à ce que la migration complète soit effectuée.
Versions
Cette histoire fera une migration de Dagger 2.24
vers Hilt 2.45
.
Contenu
- Paramétrage/Préparation
- Migrer le composant d'application et le singleton
- Migrer la classe d'application
- Migrer la classe d'activité
- Migrer le fragment
- Migrer le modèle de vue
- Nettoyage post-migration
- Résumé et plats à emporter
Pour intégrer Hilt
ajouter les dépendances suivantes dans build.gradle
le fichier de l'application Gradle
Configurez également kapt
pour définir correctErrorType sur true
dans build.gradle
le fichier
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 {
....
}
Migrer le composant d'application
Dagger contient Singleton
Component
tous les modules Dagger créés dans l'application ou d'autres modules du projet et cela se fait normalement dans AppComponent
la classe créée pour Dagger
.
Regardons le fichier AppComponent.kt actuel
Pour migrer, Singleton
Component
nous devons installer chaque module, par exemple NetworkModule , StorageModule , etc. dans SingletonComponent
for Hilt
, vous pouvez le faire en annotant tous ces modules individuels avec @InstallIn(SingletonComponent::class)
Mais si vous avez beaucoup de modules, les changer tous à la fois ne sera pas une bonne idée, mais vous pouvez plutôt créez un AggregatedModule qui sera annoté avec @InstallIn(SingletonComponent::class)
et inclut tous ces Dagger
modules annotés avec @Module(includes = [ <all of these modules > ])
.
Exécutez le projet, il déclenchera une erreur
Erreur DisableModuleHasInstallInCheck
Après avoir exécuté le projet, le projet Hilt
essaiera de trouver @InstallIn
une annotation pour chaque module inclus dans AggregatedModule
annoté avec @Module
. Hilt
déclenchera une erreur s'il trouve un module qui n'est pas annoté avec @Install
Comme nous n'avons pas annoté tous les modules avec @InstallIn
car nous sommes en pleine migration, nous pouvons désactiver cette erreur en utilisant le drapeau suivant
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
vous pouvez spécifier au niveau de l'application build.gradle
comme ci-dessous, mais nous devons supprimer cet indicateur une fois que toute la migration est terminée.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Migrer la classe d'application
Pour ajouter Hilt à l'application, annotons la Application
classe avec @HiltAndroidApp
. Vous devez supprimer @Component
et @Component.Builder
qui étaient présents en AppComponent
classe comme mentionné ci-dessus.
Si votre Application
extension DaggerApplication
ou implémente, HasAndroidInjector
vous devez toujours conserver du code comme indiqué ci-dessous dans ces deux cas. Il s'agit de prendre en charge à la fois Dagger
et Hilt
en parallèle jusqu'à ce que toute la migration soit terminée.
Si votre Application
extension de DaggerApplication
votre classe d'application ressemblera à ceci.
Et si vos Application
outils HasAndroidInjector
, votre application doit ressembler à ceci
Une fois l'ensemble de la migration terminée, vous devrez supprimer ce code de votre Application
classe et votre Application
apparence ressemblera à celle ci-dessous. (Mais ce serait l'une des dernières étapes, s'il vous plaît ne le faites pas maintenant)
Exécutez le projet, il devrait créer votre projet avec succès et l'application doit se lancer sans exception d'exécution.
Migrer la classe d'activité
Dagger permet @ContributesAndroidInjector
de spécifier n'importe quelle activité/fragment en tant que contributeur pour Android Injector, dans notre projet réalisé dans MainActivityModule
, l'un des modules inclus dansAggregatedModule
MainActivityModule
ressemble à ceci avant la migration
MainActivity
ressemble à ceci avant la migration
Afin de migrer notre MainActivity
vers Hilt
, nous nous débarrasserons complètement de MainActivityModule
la classe de module et ajouterons une annotation @AndroidEntryPoint
pour MainActivity
. Comme notre MainActivity
s'étend également à partir de, DaggerAppCompatActivity
nous devons étendre notre activité à partir de la correspondance, AppCompatActivity
donc après la migration, notre MainActivity
ressemblera à ci-dessous.
Exécutez votre projet, il devrait réussir avec MainActivity
la migration vers Hilt
Migrer Fragment/View/BroadcastReceiver
La migration de n'importe quel fragment vers Hilt
se fera avec les mêmes étapes que pour la migration MainActivity
vers Hilt. Les étapes sont ci-dessous
- Supprimez le code où vous annotez votre Fragment avec
@ContributesAndroidInjector
sa probabilité d'être un module - Supprimer le module à partir duquel
SingletonComponent
s'occupait@ContributesAndroidInjector
de votre fragment - Annotez votre fragment avec
@AndroidEntryPoint
- si votre fragment est étendu à partir de
DaggerFragment
, alors vous devez étendre votre fragment à partir deFragment
la classe
Migrer le modèle de vue
La migration de ViewModel nécessite quelques étapes.
Annotez d'abord votre viewModel avec@HiltViewModel
Pour être FeatureViewModel
injecté, Hilt
nous utiliserons l'extension de fragment viewModels()
fournie dans la dépendance d'extension de fragment que nous ajouterons dans build.gradle
le fichier correspondant comme ci-dessous
implementation "androidx.fragment:fragment-ktx:1.5.6"
Supprimez maintenant les liaisons correspondantes @Bind
et pour lesquelles @IntoMap
nous avons utilisé Dagger.@ViewModelKey
FeatureViewModel
Dans dagger pour injecter un ViewModel, nous aurions également lateinit var
une propriété qui sera injected
au moment de l'exécution en utilisant certaines ViewModelFactory
qui ne seront également plus nécessaires, vous pouvez donc supprimer ViewModelModule
et ViewModelProviderFactory
le code associé s'il n'y a pas d'autre ViewModel/Fragment encore sur Dagger.
Exécutez votre projet, il devrait réussir avec Fragment and ViewModel
la migration vers Hilt
Migrer d'autres modules.
Jusqu'à présent, nous étions en train de migrer Components
/ Modules
/ Activity
/ Fragment
dans le module app. Mais nous devons migrer d'autres modules maintenant, nous irons un module à la fois et le migrerons entièrement vers Hilt en suivant les étapes suivantes
- Ajouter
Hilt
une dépendance dans lebuild.gradle
fichier du module - Annotez chacun
@Module
avec@InstallIn
une annotation. - Supprimez
@JvmStatic
l'annotation pour chaque@Provide
annotation si vous en avez, car elle n'est plus requise dansHilt
- Annotez votre
Fragment
/Activity
avec@AndroidEntryPoint
et supprimez le correspondant@ContributesAndroidInjector
- Migrez vos ViewModels annotant avec
@HiltViewModel
et utilisez l'extension de fragmentviewModels()
pour injecter ces modèles de vue - Continuez à supprimer tous les modules qui ne seront plus nécessaires dans
AggregatedModule
.AggregatedModule
nous avons créé ci-dessus dans notre première étape.
Une fois que chaque module de projet est migré vers Hilt
. Besoin de temps de nettoyage
- Supprimer disableModuleInstallInCheck = true, que nous avons ajouté au début du niveau de l'application ou de tout autre
build.gradle
et supprimer@DisableInstallInCheck
l'annotation si elle a été ajoutée à n'importe quel@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Supprimez toutes Dagger
les dépendances dans tous vos modules.
Exécutez votre projet, il devrait être exécuté avec succès votre projet entièrement migré vers Hilt
Résumé et plats à emporter
Un aperçu de haut niveau des modifications de code après la migration ressemblera à ceci
- Toutes les annotations de code
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
auraient été supprimées - Tous vos ViewModels doivent être annotés avec
@HiltViewModel
- Toutes
@Module
les classes doivent être annotées avec@InstallIn
une annotation - Les fragments/activités/vue/service doivent être annotés avec
@AndroidEntryPoint
- La classe d'application doit être annotée avec
@HiltAndroidApp
AppComponent
et le code associé doit être supprimé@JvmStatic
les annotations à l'intérieur des modules Hilt ne doivent plus exister
- Injection de dépendance à l'aide de Hilt
- Migration vers la documentation officielle de Hilt
N'oubliez pas de suivre et si vous avez aimé :)
— — — — — — — — — — —
GitHub | LinkedIn | Twitter
Codage de niveau supérieur
Merci de faire partie de notre communauté ! Avant que tu partes:
- Applaudissez pour l'histoire et suivez l'auteur
- Voir plus de contenu dans la publication Level Up Coding
- Cours d'entretien de codage gratuit ⇒ Voir le cours
- Suivez-nous : Twitter | LinkedIn | Bulletin