Migrazione da Dagger2 a Hilt in un progetto multimodulo
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. Nei progetti reali potrebbero esserci molti più moduli ma ci stiamo limitando ai seguenti moduli.
Strategia di migrazione
Vogliamo migrare completamente Dagger
a, Hilt
ma in pratica abbiamo bisogno di un approccio incrementale in cui migreremo prima il nostro app
progetto Hilt
e poi altri moduli, il che significa Dagger
e Hilt
dovremmo lavorare in parallelo per un po 'di tempo fino al completamento della migrazione.
Versioni
Questa storia eseguirà una migrazione da Dagger 2.24
a 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 Hilt
dell'app Gradlebuild.gradle
Configura anche kapt
per impostare correctErrorType su true
in build.gradle
file
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
Component
tutti i moduli Dagger creati nell'app o altri moduli del progetto e ciò viene normalmente eseguito nella AppComponent
classe creata per Dagger
.
Diamo un'occhiata al file AppComponent.kt corrente
Per migrare Singleton
Component
dobbiamo installare ogni modulo, ad esempio NetworkModule , StorageModule ecc. in SingletonComponent
for 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 Dagger
moduli annotati con @Module(includes = [ <all of these modules > ])
.
Esegui il progetto, genererà un errore
Errore DisableModuleHasInstallInCheck
Dopo aver eseguito il progetto Hilt
proverà a trovare @InstallIn
l'annotazione per ogni modulo che è incluso in AggregatedModule
annotato con @Module
. Hilt
genereràun errore se troverà un modulo che nonèannotato con @Install
Dato che non abbiamo annotato tutti i moduli con @InstallIn
perché 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.gradle
come 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 Application
classe con @HiltAndroidApp
. Dovresti rimuovere @Component
e @Component.Builder
che erano presenti in AppComponent
classe come sopra indicato.
Se il tuo Application
si estende DaggerApplication
o implementa, HasAndroidInjector
devi comunque conservare del codice come mostrato di seguito in entrambi i casi. Questo per supportare entrambi Dagger
e Hilt
in parallelo fino al completamento dell'intera migrazione.
Se le tue Application
estensioni dalla DaggerApplication
tua classe di applicazione saranno simili a questa.
E se i tuoi Application
attrezzi HasAndroidInjector
allora la tua applicazione deve assomigliare a questo
Una volta completata l'intera migrazione, dovrai rimuovere tale codice dalla tua Application
classe e il tuo Application
aspetto 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 @ContributesAndroidInjector
a specificare qualsiasi Attività/Frammento come collaboratore per Android Injector, nel nostro progetto che è fatto in MainActivityModule
, uno dei moduli inclusi inAggregatedModule
MainActivityModule
si presenta così prima della migrazione
MainActivity
si presenta così prima della migrazione
Per migrare il nostro MainActivity
a Hilt
, elimineremo completamente MainActivityModule
la classe del modulo e aggiungeremo l'annotazione @AndroidEntryPoint
per MainActivity
. Poiché MainActivity
anche il nostro si sta estendendo da, DaggerAppCompatActivity
dobbiamo estendere la nostra attività dal corrispondente, AppCompatActivity
quindi dopo la migrazione il nostro MainActivity
sarà simile al seguente.
Esegui il tuo progetto dovrebbe avere successo con MainActivity
la migrazione in Hilt
Migra frammento/Visualizza/BroadcastReceiver
La migrazione di qualsiasi frammento in Hilt
verrà eseguita con gli stessi passaggi della migrazione MainActivity
a Hilt. I passaggi sono di seguito
- Rimuovi il codice in cui stai annotando il tuo frammento con
@ContributesAndroidInjector
la probabilità che sia un modulo - Rimuovi il modulo da
SingletonComponent
cui stava gestendo@ContributesAndroidInjector
il tuo frammento - Annota il tuo frammento con
@AndroidEntryPoint
- se il tuo frammento è esteso da
DaggerFragment
allora hai bisogno di estendere il tuo frammento dallaFragment
classe
Migra ViewModel
La migrazione di ViewModel richiede alcuni passaggi.
Per prima cosa annota il tuo viewModel con@HiltViewModel
Per essere FeatureViewModel
iniettati Hilt
utilizzeremo l'estensione del frammento viewModels()
fornita nella dipendenza dall'estensione del frammento che aggiungeremo nel build.gradle
file corrispondente come di seguito
implementation "androidx.fragment:fragment-ktx:1.5.6"
Ora rimuovi i corrispondenti @Bind
e @IntoMap
gli @ViewModelKey
attacchi per FeatureViewModel
i quali abbiamo usato per Dagger.
Nel pugnale per iniettare un ViewModel avremmo anche lateinit var
una proprietà che sarà injected
in fase di esecuzione utilizzando alcuni che non saranno più necessari , ViewModelFactory
quindi puoi eliminare e il codice correlato se non ci sono altri ViewModel/Fragment ancora su Dagger.ViewModelModule
ViewModelProviderFactory
Esegui il tuo progetto dovrebbe avere successo con Fragment and ViewModel
la migrazione in Hilt
Migrazione di altri moduli.
Finora stavamo migrando Components
/ Modules
/ Activity
/ Fragment
nel modulo app. Ma ora dobbiamo migrare altri moduli, andremo un modulo alla volta e lo migreremo completamente su Hilt usando i seguenti passaggi
- Aggiungi
Hilt
dipendenza nelbuild.gradle
file del modulo - Annota ciascuno
@Module
con@InstallIn
l'annotazione. - Rimuovi
@JvmStatic
l'annotazione per ogni@Provide
annotazione se l'hai perché non è più richiestaHilt
- Annota il tuo
Fragment
/Activity
con@AndroidEntryPoint
e rimuovi il corrispondente@ContributesAndroidInjector
- Migra i tuoi ViewModels annotando
@HiltViewModel
e usa l'estensione del frammentoviewModels()
per iniettare quei View Models - 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
- Rimuovi disableModuleInstallInCheck = true, che abbiamo aggiunto all'inizio a livello di app o qualsiasi altro
build.gradle
e rimuovendo@DisableInstallInCheck
l'annotazione se è stata aggiunta a qualsiasi@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Rimuovi tutte Dagger
le 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
- Tutte le annotazioni del codice
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
sarebbero state rimosse - Tutti i tuoi ViewModels devono essere annotati con
@HiltViewModel
- Tutte
@Module
le classi devono essere annotate con@InstallIn
annotazione - Frammenti/Attività/Vista/Servizio devono essere annotati con
@AndroidEntryPoint
- La classe dell'applicazione deve essere annotata con
@HiltAndroidApp
AppComponent
e il relativo codice devono essere rimossi@JvmStatic
le 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