Android ~ Inyección de dependencias con Hilt | Giemo | Octubre de 2020

La polémica sobre Dagger entre desarrolladores no ha terminado, y Google ha introducido otra librería para Dependency Injection, pero lo bueno del handle es que no es muy complicado y polémico, pues arrancaremos Dagger 1.0 y 2.0.

Google presenta Hilt en su última versión para desarrolladores. El identificador no trae ningún concepto nuevo, solo para crear una biblioteca contenedora en Dagger 2.0 para reducir el código estándar y las configuraciones complejas, como la sala de la base de datos de arranque, implementada en SQL lite.

Hay algunas notas que admite el mango.

@HiltAndroidYpag“Necesitamos agregar esta anotación a nuestra clase de aplicación para habilitar la empuñadura de nuestro proyecto y unirnos al ciclo de vida de la aplicación.

@AndroidEntryPoint, Esta anotación sería necesaria para agregar a estas clases, donde insertamos cualquier objeto como si estuviera insertando un objeto en una actividad, luego debe agregar esta anotación a la misma actividad que se aplica al fragmento y la vista personalizada.

Nota: Un objeto que inserte dentro de esta clase puede insertar cualquier clase, no requiere volver a agregar @AndroidEntryPoint.

@InyectarProbablemente ya esté familiarizado con la anotación @inject. Esto debe especificarse junto con el objeto, como se muestra a continuación. La anotación @Inject también funciona con el parámetro constructor y la matriz.

@Inject lateinit var dbReposatiory: DatabaseReposatiory 

Módulo de manija:

Si está familiarizado con Dagger, comprenderá fácilmente el módulo Hilt. Si desea insertar una clase que no es de su propiedad, como la clase Retrofit de una biblioteca de terceros, debemos implementar el módulo Hilt en este escenario.

@InstallIn« Al crear un módulo, debe especificar el alcance de su módulo, como actividad, fragmento y aplicación, luego su módulo se instalará en estos componentes, más allá de los cuales no podrá insertar el módulo. Se definen componentes separados para determinar el alcance del módulo.

@InstallIn(ApplicationComponent::class)
@InstallIn(ActivityComponent::class)
@InstallIn(FragmentComponent::class)
@Module
@InstallIn(ActivityComponent::class)
object AnalyticsModule {

@Provides
fun provideAnalyticsService(
// Potential dependencies of this type
): AnalyticsService {
return Retrofit.Builder()
.baseUrl("https://example.com")
.build()
.create(AnalyticsService::class.java)
}
}

En el ejemplo anterior, puede ver cómo creamos proveedores de actualización porque no podemos incrustar directamente bibliotecas de terceros hasta que también usen arcilla y permitan la inyección directa.

Inyección de interfaz:

El mango también proporciona una interfaz de inyección como una daga. Podemos lograr esto usando la anotación @Binds, agregue un método al módulo del componente para determinar la implementación de la interfaz en el parámetro, como se muestra.

@Module
@InstallIn(ActivityComponent::class)
abstract class AnalyticsModule {
@Binds
abstract fun bindAnalyticsService(
analyticsServiceImpl: AnalyticsServiceImpl
): AnalyticsService
}

Cualificaciones:

Los calificadores se utilizan cuando tenemos que proporcionar la misma dependencia con diferentes variantes como le gustaría inyectar un motor, pero hay dos tipos de motores, uno es un motor de gasolina y el otro es un motor híbrido, en cuyo caso agregamos una calificación a nuestra dependencia para distinguir entre ellos y en En el momento de la inyección, debemos mencionar la variante de motor requerida.

  1. Presentamos la calificación Hilt
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class PetrolEngine
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class HybridEngine

2. Cree un proveedor de variantes de motor.

@Module
@InstallIn(ApplicationComponent::class)
object EngineModule {
@PetrolEngine
@Provides
fun providePetrolEngine(petrolEngine: PetrolEngine): Engine {
return PetrolEngine.create()
}
@HybridEngine
fun provideHybridEngine(hybridEngine: HybridEngine): Engine {
return HybridEngine.create()
}
}

3. Inyección

@AndroidEntryPoint
class HomeActivity: AppCompatActivity() {
@PetrolEngine
@Inject lateinit var petrolEngine: PetrolEngine
@PetrolEngine
@Inject lateinit var hybridEngine: HybridEngine
}

En el ejemplo anterior, vemos cómo agregar un calificador personalizado en Hilt para insertar otra variante de la misma dependencia.

Hay calificadores predefinidos en Hilt, puede acceder al contexto de la aplicación / actividad utilizando estos calificadores @ApplicationContext @ActivityContext predefinidos.

Rangos de componentes:

El alcance es definir los límites del objeto fuera del límite creado por la nueva instancia del objeto. De forma predeterminada, todos los objetos no están encriptados, es decir, cada vez que recibe una nueva instancia de un objeto.

Ya se mencionan varias disciplinas, que Hilt ya ha definido.

@Singleton, @ActivityScoped, @FragmentScoped, @ViewScoped, @ServiceScoped

Puede utilizar cualquiera de ellos según sus necesidades.

@ActivityScoped
class UsersAdapter @Inject constructor() { ... }

Jerarquía de componentes:

Puede acceder a cualquier enlace de módulo de su propio componente o cualquier componente secundario que se encuentre dentro de su jerarquía. Veamos la jerarquía de componentes.

En esta jerarquía, ilustre que un niño puede acceder a las dependencias de los padres con un alcance, como uno que estaba centrado en la actividad, pero también puede insertar un fragmento / vista.

Si quieres saberlo migración de Dagger a Hilt, luego verifique el enlace a continuación.
https://dagger.dev/hilt/migration-guide

¡¡¡Gracias!!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *