Migrazione da Dagger2 a Hilt in un progetto multimodulo

May 10 2023
Una guida passo passo per migrare da Dagger a Hilt in un progetto multi modulo. Struttura del progetto Per visualizzare il progetto, contiene più moduli NetworkModule, StorageModule, CommonModule, FeatureModule ecc.

Una guida passo passo per migrare da Daggera Hiltin un progetto multi modulo.

Foto di Saif71.com su Unsplash

Struttura del progetto

Per visualizzare il progetto, contiene più moduli NetworkModule, StorageModule, CommonModule, FeatureModule ecc. Nei progetti reali potrebbero esserci molti più moduli ma ci stiamo limitando ai seguenti moduli.

Strategia di migrazione

Vogliamo migrare completamente Daggera, Hiltma in pratica abbiamo bisogno di un approccio incrementale in cui migreremo prima il nostro appprogetto Hilte poi altri moduli, il che significa Daggere Hiltdovremmo lavorare in parallelo per un po 'di tempo fino al completamento della migrazione.

Versioni

Questa storia eseguirà una migrazione da Dagger 2.24a Hilt 2.45.

Contenuto

  • Configurazione/Preparazione
  • Migrazione del componente dell'app e di Singleton
  • Migrare la classe dell'applicazione
  • Classe di attività di migrazione
  • Frammento di migrazione
  • Migra ViewModel
  • Pulizia post migrazione
  • Sommario e Takeaways

Per integrare aggiungi le seguenti dipendenze nel file Hiltdell'app Gradlebuild.gradle

Configura anche kaptper impostare correctErrorType su truein build.gradlefile

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

Migra componente app

Dagger include Singleton Componenttutti i moduli Dagger creati nell'app o altri moduli del progetto e ciò viene normalmente eseguito nella AppComponentclasse creata per Dagger.

Diamo un'occhiata al file AppComponent.kt corrente

Per migrare Singleton Componentdobbiamo installare ogni modulo, ad esempio NetworkModule , StorageModule ecc. in SingletonComponentfor Hilt, puoi farlo annotando tutti quei singoli moduli con @InstallIn(SingletonComponent::class)Ma se hai molti moduli cambiarli tutti in una volta non sarà una buona idea ma piuttosto puoi crea un AggregatedModule che sarà annotato con @InstallIn(SingletonComponent::class)e include tutti questi Daggermoduli annotati con @Module(includes = [ <all of these modules > ]).

Esegui il progetto, genererà un errore

Errore DisableModuleHasInstallInCheck

Dopo aver eseguito il progetto Hiltproverà a trovare @InstallInl'annotazione per ogni modulo che è incluso in AggregatedModuleannotato con @Module. Hiltgenereràun errore se troverà un modulo che nonèannotato con @InstallDato che non abbiamo annotato tutti i moduli con @InstallInperché siamo nel bel mezzo della migrazione, possiamo disabilitare questo errore usando il flag seguente

-Adagger.hilt.disableModulesHaveInstallInCheck=true.

puoi specificare a livello di app build.gradlecome di seguito, ma dovremmo rimuovere questo flag una volta completata tutta la migrazione.

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

Migrare la classe dell'applicazione

Per aggiungere Hilt all'applicazione, annotiamo la Applicationclasse con @HiltAndroidApp. Dovresti rimuovere @Componente @Component.Builderche erano presenti in AppComponentclasse come sopra indicato.

Se il tuo Applicationsi estende DaggerApplicationo implementa, HasAndroidInjectordevi comunque conservare del codice come mostrato di seguito in entrambi i casi. Questo per supportare entrambi Daggere Hiltin parallelo fino al completamento dell'intera migrazione.

Se le tue Applicationestensioni dalla DaggerApplicationtua classe di applicazione saranno simili a questa.

E se i tuoi Applicationattrezzi HasAndroidInjectorallora la tua applicazione deve assomigliare a questo

Una volta completata l'intera migrazione, dovrai rimuovere tale codice dalla tua Applicationclasse e il tuo Applicationaspetto apparirà come di seguito. ( Ma questo sarebbe uno degli ultimi passaggi, per favore non farlo ora )

Esegui il progetto, dovrebbe creare correttamente il tuo progetto e l'app deve avviarsi senza eccezioni di runtime.

Classe di attività di migrazione

Dagger provvede @ContributesAndroidInjectora specificare qualsiasi Attività/Frammento come collaboratore per Android Injector, nel nostro progetto che è fatto in MainActivityModule, uno dei moduli inclusi inAggregatedModule

MainActivityModulesi presenta così prima della migrazione

MainActivitysi presenta così prima della migrazione

Per migrare il nostro MainActivitya Hilt, elimineremo completamente MainActivityModulela classe del modulo e aggiungeremo l'annotazione @AndroidEntryPointper MainActivity. Poiché MainActivityanche il nostro si sta estendendo da, DaggerAppCompatActivitydobbiamo estendere la nostra attività dal corrispondente, AppCompatActivityquindi dopo la migrazione il nostro MainActivitysarà simile al seguente.

Esegui il tuo progetto dovrebbe avere successo con MainActivityla migrazione in Hilt

Migra frammento/Visualizza/BroadcastReceiver

La migrazione di qualsiasi frammento in Hiltverrà eseguita con gli stessi passaggi della migrazione MainActivitya Hilt. I passaggi sono di seguito

  1. Rimuovi il codice in cui stai annotando il tuo frammento con @ContributesAndroidInjectorla probabilità che sia un modulo
  2. Rimuovi il modulo da SingletonComponentcui stava gestendo @ContributesAndroidInjectoril tuo frammento
  3. Annota il tuo frammento con@AndroidEntryPoint
  4. se il tuo frammento è esteso da DaggerFragmentallora hai bisogno di estendere il tuo frammento dalla Fragmentclasse

Migra ViewModel

La migrazione di ViewModel richiede alcuni passaggi.

Per prima cosa annota il tuo viewModel con@HiltViewModel

Per essere FeatureViewModeliniettati Hiltutilizzeremo l'estensione del frammento viewModels()fornita nella dipendenza dall'estensione del frammento che aggiungeremo nel build.gradlefile corrispondente come di seguito

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

Ora rimuovi i corrispondenti @Binde @IntoMapgli @ViewModelKeyattacchi per FeatureViewModeli quali abbiamo usato per Dagger.

Nel pugnale per iniettare un ViewModel avremmo anche lateinit varuna proprietà che sarà injectedin fase di esecuzione utilizzando alcuni che non saranno più necessari , ViewModelFactoryquindi puoi eliminare e il codice correlato se non ci sono altri ViewModel/Fragment ancora su Dagger.ViewModelModuleViewModelProviderFactory

Esegui il tuo progetto dovrebbe avere successo con Fragment and ViewModella migrazione in Hilt

Migrazione di altri moduli.

Finora stavamo migrando Components/ Modules/ Activity/ Fragmentnel modulo app. Ma ora dobbiamo migrare altri moduli, andremo un modulo alla volta e lo migreremo completamente su Hilt usando i seguenti passaggi

  1. Aggiungi Hiltdipendenza nel build.gradlefile del modulo
  2. Annota ciascuno @Modulecon @InstallInl'annotazione.
  3. Rimuovi @JvmStaticl'annotazione per ogni @Provideannotazione se l'hai perché non è più richiestaHilt
  4. Annota il tuo Fragment/ Activitycon @AndroidEntryPointe rimuovi il corrispondente@ContributesAndroidInjector
  5. Migra i tuoi ViewModels annotando @HiltViewModele usa l'estensione del frammento viewModels()per iniettare quei View Models
  6. Continua a rimuovere tutti quei Moduli che non saranno più richiesti in AggregatedModule. AggregatedModule abbiamo creato sopra nel nostro primo passaggio.

Una volta che ogni modulo del progetto è stato migrato in Hilt. Bisogno di pulire il tempo

  1. Rimuovi disableModuleInstallInCheck = true, che abbiamo aggiunto all'inizio a livello di app o qualsiasi altro build.gradlee rimuovendo @DisableInstallInCheckl'annotazione se è stata aggiunta a qualsiasi@Module
  2. defaultConfig {
       
        //TODO: remove this after migration to Hilt
        javaCompileOptions {
            annotationProcessorOptions {
                arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
            }
        }
    }
    

4. Rimuovi tutte Daggerle dipendenze in tutti i tuoi moduli.

Esegui il tuo progetto dovrebbe essere eseguito correttamente il tuo progetto migrato completamente in Hilt

Sommario e Takeaways

La panoramica di alto livello delle modifiche al codice dopo la migrazione sarà simile a questa

  1. Tutte le annotazioni del codice @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeysarebbero state rimosse
  2. Tutti i tuoi ViewModels devono essere annotati con@HiltViewModel
  3. Tutte @Modulele classi devono essere annotate con @InstallInannotazione
  4. Frammenti/Attività/Vista/Servizio devono essere annotati con@AndroidEntryPoint
  5. La classe dell'applicazione deve essere annotata con@HiltAndroidApp
  6. AppComponente il relativo codice devono essere rimossi
  7. @JvmStaticle annotazioni all'interno dei moduli Hilt non devono più esistere
  • Iniezione di dipendenze tramite Hilt
  • Migrare alla documentazione ufficiale di Hilt

Ricordati di seguire e se ti è piaciuto :)

— — — — — — — — — — — —

Git Hub | Linkedin | Cinguettio

Codifica di livello superiore

Grazie per far parte della nostra comunità! Prima che tu vada:

  • Batti le mani per la storia e segui l'autore
  • Visualizza altri contenuti nella pubblicazione Level Up Coding
  • Corso di colloquio di codifica gratuito ⇒ Visualizza il corso
  • Seguici: Twitter | Linkedin | Notiziario