Migrar de Dagger2 a Hilt en un proyecto de varios módulos
Un guid paso a paso para migrar de Dagger
a Hilt
en un proyecto de varios módulos.
Estructura del proyecto
Para visualizar el proyecto, contiene varios módulos NetworkModule, StorageModule, CommonModule, FeatureModule, etc. En proyectos reales, podría haber muchos más módulos, pero nos limitamos a los siguientes módulos.

Estrategia de migración
Queremos migrar completamente Dagger
a Hilt
pero en la práctica necesitamos un enfoque incremental en el que primero migraremos nuestro app
proyecto Hilt
y luego otros módulos, eso significa Dagger
y Hilt
debería funcionar en paralelo durante algún tiempo hasta que se complete la migración.
Versiones
Esta historia hará una migración de Dagger 2.24
a Hilt 2.45
.
Contenido
- Configuración/Preparación
- Migrar componente de aplicación y Singleton
- Migrar clase de aplicación
- Migrar clase de actividad
- Migrar fragmento
- Migrar modelo de vista
- Limpieza posterior a la migración
- Resumen y conclusiones
Para integrar , agregue las siguientes dependencias en el archivo Hilt
de la aplicación Gradlebuild.gradle
También configure kapt
para establecer correctErrorType en true
el build.gradle
archivo
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 {
....
}
Migrar componente de aplicación
Dagger tiene Singleton
Component
que incluye todos los módulos de Dagger creados en la aplicación u otros módulos del proyecto y eso normalmente se hace en la AppComponent
clase creada para Dagger
.
Veamos el archivo AppComponent.kt actual
Para migrar, Singleton
Component
necesitamos instalar cada módulo, por ejemplo, NetworkModule , StorageModule , etc., en SingletonComponent
for Hilt
, puede hacerlo anotando todos esos módulos individuales con @InstallIn(SingletonComponent::class)
Pero si tiene muchos módulos, cambiarlos todos a la vez no será una buena idea, pero puede hacerlo cree un AggregatedModule que se anotará con @InstallIn(SingletonComponent::class)
e incluye todos estos Dagger
módulos anotados con @Module(includes = [ <all of these modules > ])
.
Ejecute el proyecto, generará un error
DisableModuleHasInstallInCheckError
Después de ejecutar el proyecto, Hilt
intentará encontrar @InstallIn
una anotación para cada módulo que se incluye en AggregatedModule
anotado con @Module
. Hilt
generará un error si encuentra un módulo que no está anotado con @Install
Como no hemos anotado todos los módulos @InstallIn
porque estamos en medio de la migración, podemos desactivar este error usando el siguiente indicador
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
puede especificar en el nivel de la aplicación build.gradle
como se muestra a continuación, pero debemos eliminar esta marca una vez que se complete toda la migración.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Migrar clase de aplicación
Para agregar Hilt a la aplicación, anotemos la Application
clase con @HiltAndroidApp
. Debe eliminar @Component
y @Component.Builder
cuáles estaban presentes en AppComponent
clase como se mencionó anteriormente.
Si se Application
extiende DaggerApplication
o implementa, HasAndroidInjector
aún necesita mantener algo de código como se muestra a continuación en ambos casos. Esto es para admitir ambos Dagger
y Hilt
en paralelo hasta que se complete toda la migración.
Si se Application
extiende desde DaggerApplication
su clase de aplicación, se verá así.
Y si Application
implementa HasAndroidInjector
, su aplicación debe verse así
Una vez que se complete toda la migración, deberá eliminar dicho código de su Application
clase y se Application
verá como se muestra a continuación. (Pero ese sería uno de los últimos pasos, por favor no lo hagas ahora)
Ejecute el proyecto, debería compilar correctamente su proyecto y la aplicación debe iniciarse sin excepciones de tiempo de ejecución.
Migrar clase de actividad
Dagger permite @ContributesAndroidInjector
especificar cualquier Actividad/Fragmento como contribuyente para Android Injector, en nuestro proyecto que se realiza en MainActivityModule
, uno de los módulos incluidos enAggregatedModule
MainActivityModule
se ve así antes de la migración
MainActivity
se ve así antes de la migración
Para migrar nuestro MainActivity
a Hilt
, nos desharemos por completo de MainActivityModule
la clase de módulo y agregaremos una anotación @AndroidEntryPoint
para MainActivity
. Como nuestro MainActivity
también se está extendiendo desde, DaggerAppCompatActivity
necesitamos extender nuestra actividad desde correspondiente, AppCompatActivity
por lo que después de la migración, nuestro MainActivity
se verá como se muestra a continuación.
Ejecute su proyecto, debería tener éxito con MainActivity
la migración a Hilt
Migrar Fragmento/Ver/BroadcastReceiver
La migración de cualquier Fragmento Hilt
a se realizará con los mismos pasos que hicimos para migrar MainActivity
a Hilt. Los pasos están abajo
- Elimine el código donde está anotando su Fragmento con
@ContributesAndroidInjector
la probabilidad de que sea un módulo - Eliminar módulo del
SingletonComponent
que se estaba manejando@ContributesAndroidInjector
para su fragmento - Anote su Fragmento con
@AndroidEntryPoint
- si su fragmento se extiende desde
DaggerFragment
entonces, necesita extender su fragmento deFragment
la clase
Migrar modelo de vista
La migración de ViewModel requiere algunos pasos.
En primer lugar, anote su modelo de vista con@HiltViewModel
Para FeatureViewModel
inyectarnos, Hilt
usaremos la extensión de fragmento viewModels()
proporcionada en la dependencia de extensión de fragmento que agregaremos en el build.gradle
archivo correspondiente como se muestra a continuación
implementation "androidx.fragment:fragment-ktx:1.5.6"
Ahora elimine los enlaces correspondientes y @Bind
para los que usamos para Dagger.@IntoMap
@ViewModelKey
FeatureViewModel
En dagger para inyectar un ViewModel, también tendríamos lateinit var
propiedades que estarán injected
en tiempo de ejecución usando algunas que ya no serán necesarias , ViewModelFactory
por lo que puede eliminar y el código relacionado si no hay otro ViewModel/Fragment todavía en Dagger.ViewModelModule
ViewModelProviderFactory
Ejecute su proyecto, debería tener éxito con Fragment and ViewModel
la migración a Hilt
Migrar otros módulos.
Hasta ahora estábamos migrando Components
/// en el módulo de la aplicación Modules
. Pero tenemos que migrar otros módulos ahora. Iremos un módulo a la vez y lo migraremos completamente a Hilt siguiendo los siguientes pasosActivity
Fragment
- Agregar
Hilt
dependencia en elbuild.gradle
archivo del módulo. - Anote cada uno
@Module
con@InstallIn
anotación. - Elimine
@JvmStatic
la anotación para cada@Provide
anotación si tiene porque ya no es necesaria enHilt
- Anote su
Fragment
/Activity
con@AndroidEntryPoint
y elimine el correspondiente@ContributesAndroidInjector
- Migre sus ViewModels anotando
@HiltViewModel
y use la extensión de fragmentosviewModels()
para inyectar esos View Models - Siga eliminando todos los módulos que ya no serán necesarios en
AggregatedModule
.AggregatedModule
creamos arriba en nuestro primer paso.
Una vez que cada módulo de proyecto se migre a Hilt
. Necesidad de tiempo de limpieza
- Eliminar disabledModuleInstallInCheck = true, que agregamos al principio en el nivel de la aplicación o cualquier otro
build.gradle
y eliminar@DisableInstallInCheck
la anotación si se agregó a alguna@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Elimina todas Dagger
las dependencias en todos tus módulos.
Ejecute su proyecto, debería ejecutarse con éxito su proyecto migrado por completo a Hilt
Resumen y conclusiones
La descripción general de alto nivel de los cambios de código después de la migración se verá así
- Todas las anotaciones de código
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
se habrían eliminado - Todos sus ViewModels deben estar anotados con
@HiltViewModel
- Todas
@Module
las clases deben estar anotadas con@InstallIn
anotación - Los fragmentos/Actividades/Vista/Servicio se deben anotar con
@AndroidEntryPoint
- La clase de aplicación se debe anotar con
@HiltAndroidApp
AppComponent
y el código relacionado debe eliminarse@JvmStatic
las anotaciones dentro de los módulos de Hilt ya no deben existir
- Inyección de dependencia usando Hilt
- Migrar a la documentación oficial de Hilt
Recuerda seguir y si te gustó :)
— — — — — — — — — — —
GitHub | LinkedIn | Gorjeo
Codificación de nivel superior
¡Gracias por ser parte de nuestra comunidad! Antes de que te vayas:
- Aplaude la historia y sigue al autor
- Ver más contenido en la publicación Level Up Coding
- Curso gratuito de entrevista de codificación ⇒ Ver curso
- Síguenos: Twitter | LinkedIn | Boletin informativo