Migrer de Dagger2 vers Hilt dans un projet multi-modules

May 10 2023
Un guide étape par étape pour migrer de Dagger à Hilt dans un projet multi-module. Structure du projet Pour visualiser le projet, il contient plusieurs modules NetworkModule, StorageModule, CommonModule, FeatureModule etc.

Un guide étape par étape pour migrer de Daggervers Hiltdans un projet multi-modules.

Photo de Saif71.com sur Unsplash

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

  1. Supprimez le code où vous annotez votre Fragment avec @ContributesAndroidInjectorsa probabilité d'être un module
  2. Supprimer le module à partir duquel SingletonComponents'occupait @ContributesAndroidInjectorde votre fragment
  3. Annotez votre fragment avec@AndroidEntryPoint
  4. si votre fragment est étendu à partir de DaggerFragment, alors vous devez étendre votre fragment à partir de Fragmentla 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

  1. Ajouter Hiltune dépendance dans le build.gradlefichier du module
  2. Annotez chacun @Moduleavec @InstallInune annotation.
  3. Supprimez @JvmStaticl'annotation pour chaque @Provideannotation si vous en avez, car elle n'est plus requise dansHilt
  4. Annotez votre Fragment/ Activityavec @AndroidEntryPointet supprimez le correspondant@ContributesAndroidInjector
  5. Migrez vos ViewModels annotant avec @HiltViewModelet utilisez l'extension de fragment viewModels()pour injecter ces modèles de vue
  6. 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

  1. 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
  2. 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

  1. Toutes les annotations de code @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeyauraient été supprimées
  2. Tous vos ViewModels doivent être annotés avec@HiltViewModel
  3. Toutes @Moduleles classes doivent être annotées avec @InstallInune annotation
  4. Les fragments/activités/vue/service doivent être annotés avec@AndroidEntryPoint
  5. La classe d'application doit être annotée avec@HiltAndroidApp
  6. AppComponentet le code associé doit être supprimé
  7. @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