Migrer de Dagger2 vers Hilt dans un projet multi-modules
Un guide étape par étape pour migrer de Daggervers Hiltdans 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 Daggervers, Hiltmais en pratique, nous avons besoin d'une approche incrémentielle où nous allons d'abord migrer notre appprojet vers Hilt, puis d'autres modules, ce qui signifie Daggeret Hiltdevrait 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.24vers 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 Hiltajouter les dépendances suivantes dans build.gradlele fichier de l'application Gradle
Configurez également kaptpour définir correctErrorType sur truedans build.gradlele 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 Componenttous les modules Dagger créés dans l'application ou d'autres modules du projet et cela se fait normalement dans AppComponentla classe créée pour Dagger.
Regardons le fichier AppComponent.kt actuel
Pour migrer, Singleton Componentnous devons installer chaque module, par exemple NetworkModule , StorageModule , etc. dans SingletonComponentfor 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 Daggermodules 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 Hiltessaiera de trouver @InstallInune annotation pour chaque module inclus dans AggregatedModuleannoté avec @Module. Hiltdéclenchera une erreur s'il trouve un module qui n'est pas annoté avec @InstallComme nous n'avons pas annoté tous les modules avec @InstallIncar 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.gradlecomme 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 Applicationclasse avec @HiltAndroidApp. Vous devez supprimer @Componentet @Component.Builderqui étaient présents en AppComponentclasse comme mentionné ci-dessus.
Si votre Applicationextension DaggerApplicationou implémente, HasAndroidInjectorvous devez toujours conserver du code comme indiqué ci-dessous dans ces deux cas. Il s'agit de prendre en charge à la fois Daggeret Hilten parallèle jusqu'à ce que toute la migration soit terminée.
Si votre Applicationextension de DaggerApplicationvotre classe d'application ressemblera à ceci.
Et si vos Applicationoutils HasAndroidInjector, votre application doit ressembler à ceci
Une fois l'ensemble de la migration terminée, vous devrez supprimer ce code de votre Applicationclasse et votre Applicationapparence 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 @ContributesAndroidInjectorde 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
MainActivityModuleressemble à ceci avant la migration
MainActivityressemble à ceci avant la migration
Afin de migrer notre MainActivityvers Hilt, nous nous débarrasserons complètement de MainActivityModulela classe de module et ajouterons une annotation @AndroidEntryPointpour MainActivity. Comme notre MainActivitys'étend également à partir de, DaggerAppCompatActivitynous devons étendre notre activité à partir de la correspondance, AppCompatActivitydonc après la migration, notre MainActivityressemblera à ci-dessous.
 Exécutez votre projet, il devrait réussir avec MainActivityla migration vers Hilt
Migrer Fragment/View/BroadcastReceiver
La migration de n'importe quel fragment vers Hiltse fera avec les mêmes étapes que pour la migration MainActivityvers Hilt. Les étapes sont ci-dessous
- Supprimez le code où vous annotez votre Fragment avec @ContributesAndroidInjectorsa probabilité d'être un module
- Supprimer le module à partir duquel SingletonComponents'occupait@ContributesAndroidInjectorde votre fragment
- Annotez votre fragment avec@AndroidEntryPoint
- si votre fragment est étendu à partir de DaggerFragment, alors vous devez étendre votre fragment à partir deFragmentla classe
Migrer le modèle de vue
La migration de ViewModel nécessite quelques étapes.
Annotez d'abord votre viewModel avec@HiltViewModel
Pour être FeatureViewModelinjecté, Hiltnous utiliserons l'extension de fragment viewModels()fournie dans la dépendance d'extension de fragment que nous ajouterons dans build.gradlele fichier correspondant comme ci-dessous
implementation "androidx.fragment:fragment-ktx:1.5.6"
Supprimez maintenant les liaisons correspondantes @Bindet pour lesquelles @IntoMapnous avons utilisé Dagger.@ViewModelKeyFeatureViewModel
Dans dagger pour injecter un ViewModel, nous aurions également lateinit varune propriété qui sera injectedau moment de l'exécution en utilisant certaines ViewModelFactoryqui ne seront également plus nécessaires, vous pouvez donc supprimer ViewModelModuleet ViewModelProviderFactoryle 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 ViewModella migration vers Hilt
Migrer d'autres modules.
Jusqu'à présent, nous étions en train de migrer Components/ Modules/ Activity/ Fragmentdans 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 Hiltune dépendance dans lebuild.gradlefichier du module
- Annotez chacun @Moduleavec@InstallInune annotation.
- Supprimez @JvmStaticl'annotation pour chaque@Provideannotation si vous en avez, car elle n'est plus requise dansHilt
- Annotez votre Fragment/Activityavec@AndroidEntryPointet supprimez le correspondant@ContributesAndroidInjector
- Migrez vos ViewModels annotant avec @HiltViewModelet 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.AggregatedModulenous 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.gradleet supprimer@DisableInstallInCheckl'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 Daggerles 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/@ViewModelKeyauraient été supprimées
- Tous vos ViewModels doivent être annotés avec@HiltViewModel
- Toutes @Moduleles classes doivent être annotées avec@InstallInune annotation
- Les fragments/activités/vue/service doivent être annotés avec@AndroidEntryPoint
- La classe d'application doit être annotée avec@HiltAndroidApp
- AppComponentet le code associé doit être supprimé
- @JvmStaticles 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
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































