Migrar de Dagger2 a Hilt en un proyecto de varios módulos
Un guid paso a paso para migrar de Daggera Hilten 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 Daggera Hiltpero en la práctica necesitamos un enfoque incremental en el que primero migraremos nuestro appproyecto Hilty luego otros módulos, eso significa Daggery Hiltdeberí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.24a 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 Hiltde la aplicación Gradlebuild.gradle
También configure kaptpara establecer correctErrorType en trueel build.gradlearchivo
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 Componentque 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 AppComponentclase creada para Dagger.
Veamos el archivo AppComponent.kt actual
Para migrar, Singleton Componentnecesitamos instalar cada módulo, por ejemplo, NetworkModule , StorageModule , etc., en SingletonComponentfor 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 Daggermódulos anotados con @Module(includes = [ <all of these modules > ]).
Ejecute el proyecto, generará un error
DisableModuleHasInstallInCheckError
Después de ejecutar el proyecto, Hiltintentará encontrar @InstallInuna anotación para cada módulo que se incluye en AggregatedModuleanotado con @Module. Hiltgenerará un error si encuentra un módulo que no está anotado con @InstallComo no hemos anotado todos los módulos @InstallInporque 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.gradlecomo 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 Applicationclase con @HiltAndroidApp. Debe eliminar @Componenty @Component.Buildercuáles estaban presentes en AppComponentclase como se mencionó anteriormente.
Si se Applicationextiende DaggerApplicationo implementa, HasAndroidInjectoraún necesita mantener algo de código como se muestra a continuación en ambos casos. Esto es para admitir ambos Daggery Hilten paralelo hasta que se complete toda la migración.
Si se Applicationextiende desde DaggerApplicationsu clase de aplicación, se verá así.
Y si Applicationimplementa HasAndroidInjector, su aplicación debe verse así
Una vez que se complete toda la migración, deberá eliminar dicho código de su Applicationclase y se Applicationverá 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 @ContributesAndroidInjectorespecificar cualquier Actividad/Fragmento como contribuyente para Android Injector, en nuestro proyecto que se realiza en MainActivityModule, uno de los módulos incluidos enAggregatedModule
MainActivityModulese ve así antes de la migración
MainActivityse ve así antes de la migración
Para migrar nuestro MainActivitya Hilt, nos desharemos por completo de MainActivityModulela clase de módulo y agregaremos una anotación @AndroidEntryPointpara MainActivity. Como nuestro MainActivitytambién se está extendiendo desde, DaggerAppCompatActivitynecesitamos extender nuestra actividad desde correspondiente, AppCompatActivitypor lo que después de la migración, nuestro MainActivityse verá como se muestra a continuación.
Ejecute su proyecto, debería tener éxito con MainActivityla migración a Hilt
Migrar Fragmento/Ver/BroadcastReceiver
La migración de cualquier Fragmento Hilta se realizará con los mismos pasos que hicimos para migrar MainActivitya Hilt. Los pasos están abajo
- Elimine el código donde está anotando su Fragmento con
@ContributesAndroidInjectorla probabilidad de que sea un módulo - Eliminar módulo del
SingletonComponentque se estaba manejando@ContributesAndroidInjectorpara su fragmento - Anote su Fragmento con
@AndroidEntryPoint - si su fragmento se extiende desde
DaggerFragmententonces, necesita extender su fragmento deFragmentla clase
Migrar modelo de vista
La migración de ViewModel requiere algunos pasos.
En primer lugar, anote su modelo de vista con@HiltViewModel
Para FeatureViewModelinyectarnos, Hiltusaremos la extensión de fragmento viewModels()proporcionada en la dependencia de extensión de fragmento que agregaremos en el build.gradlearchivo correspondiente como se muestra a continuación
implementation "androidx.fragment:fragment-ktx:1.5.6"
Ahora elimine los enlaces correspondientes y @Bindpara los que usamos para Dagger.@IntoMap@ViewModelKeyFeatureViewModel
En dagger para inyectar un ViewModel, también tendríamos lateinit varpropiedades que estarán injecteden tiempo de ejecución usando algunas que ya no serán necesarias , ViewModelFactorypor lo que puede eliminar y el código relacionado si no hay otro ViewModel/Fragment todavía en Dagger.ViewModelModuleViewModelProviderFactory
Ejecute su proyecto, debería tener éxito con Fragment and ViewModella 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 pasosActivityFragment
- Agregar
Hiltdependencia en elbuild.gradlearchivo del módulo. - Anote cada uno
@Modulecon@InstallInanotación. - Elimine
@JvmStaticla anotación para cada@Provideanotación si tiene porque ya no es necesaria enHilt - Anote su
Fragment/Activitycon@AndroidEntryPointy elimine el correspondiente@ContributesAndroidInjector - Migre sus ViewModels anotando
@HiltViewModely 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.AggregatedModulecreamos 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.gradley eliminar@DisableInstallInCheckla 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 Daggerlas 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/@ViewModelKeyse habrían eliminado - Todos sus ViewModels deben estar anotados con
@HiltViewModel - Todas
@Modulelas clases deben estar anotadas con@InstallInanotación - Los fragmentos/Actividades/Vista/Servicio se deben anotar con
@AndroidEntryPoint - La clase de aplicación se debe anotar con
@HiltAndroidApp AppComponenty el código relacionado debe eliminarse@JvmStaticlas 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

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































