Generalidades

Introducción a Hilt en la serie MAD Skills | Autor: Manuel Vivo | Desarrollador de Android | Agosto de 2021

Primer episodio de la serie Hilt MAD Skill

Manuel Vivo

¡Esta es una serie de artículos sobre las habilidades MAD de Hilt! En este artículo, entenderemos por qué la inyección de dependencia (DI) es importante para su aplicación y Hilt (la solución recomendada por Jetpack para DI en Android).

Si prefiere utilizar este contenido en formato de video, marque aquí:

Siguiendo los principios de la inyección de dependencias en sus aplicaciones de Android, puede sentar las bases para una buena arquitectura de aplicaciones. Contribuye a la reutilización del código, ¡es fácil de refactorizar y de probar! Obtenga más información sobre los derechos de DI aquí.

Al crear una instancia de una clase en un proyecto, puede ejecutar manualmente el gráfico de dependencia satisfaciendo las dependencias y las dependencias transitivas requeridas por la clase.

Pero cada vez que realiza esta operación manualmente, se involucra algún código repetitivo y puede ser propenso a errores. Por ejemplo, vea uno de los ViewModels que tenemos en iosched (aplicación de E / S de Google de código abierto). ¿Te imaginas la cantidad de código que se necesita para crear uno? FeedViewModel ¿Y sus dependencias y dependencias transitivas?

Esto es difícil, repetitivo y fácilmente podemos cometer errores sobre las dependencias. Al usar una biblioteca de inyección de dependencias, podemos obtener los beneficios de DI sin tener que proporcionar dependencias manualmente, porque la biblioteca generará todo el código necesario para usted. Aquí es donde entra en juego Hilt.

Hilt es una biblioteca de inyección de dependencias desarrollada por Google. Te ayuda a aprovechar al máximo las mejores prácticas de DI en tu aplicación trabajando duro y generando todo el texto estándar que necesitas para escribir en otras situaciones.

Al usar comentarios, Hilt genera este código en tiempo de compilación, haciéndolo muy rápido en tiempo de ejecución. Esto se hace usando las poderosas funciones de Dagger, que es una biblioteca JVM DI construida sobre Hilt.

Hilt es una solución DI para aplicaciones de Android recomendada por Jetpack, con herramientas y otro soporte de biblioteca Jetpack.

Todas las aplicaciones que utilizan Hilt deben incluir una clase de aplicación anotada como @HiltAndroidApp Porque activará la generación de código de Hilt en tiempo de compilación.Para que Hilt pueda inyectar dependencias en una actividad, la actividad debe usar @AndroidEntryPoint.

Para inyectar dependencias, comente las variables que desea que Hilt inyecte @Inject.Todas las variables inyectadas por Hilt estarán disponibles en las siguientes situaciones super.onCreate Llamado.

En este ejemplo, inyectamos un MusicPlayer Ingresar PlayActivity. Pero, ¿cómo sabe Hilt cómo proporcionar instancias de tipos MusicPlayer? Bueno, no actualmente! Necesitamos que Hilt sepa cómo hacerlo … ¡use comentarios! ciertamente.

Constructor de clases de anotaciones @Inject Dígale a Hilt cómo crear una instancia de esta clase.

¡Esto es todo lo que necesita para inyectar dependencias en la actividad! ¡Eso es fácil! Comenzamos con un ejemplo simple, porque MusicPlayer no depende de ningún otro tipo. Sin embargo, si pasamos otras dependencias como parámetros, Hilt manejará y satisfará estas dependencias cuando proporcione una instancia de MusicPlayer.

Este es en realidad un ejemplo muy simple e ingenuo. Pero si tuvieras que completar manualmente el trabajo que hemos realizado hasta ahora, ¿qué harías?

Al hacer DI manualmente, puede tener Contenedor dependiente La clase responsable de proporcionar tipos y administrar el ciclo de vida de las instancias que proporciona. Simplifique un poco aquí, ¡esto es lo que hace Hilt detrás de escena!

Cuando anotas Actividad @AndroidEntryPoint, Se crea, gestiona y asocia automáticamente un contenedor dependiente PlayActivity. Llamemos a su implementación manual PlayActivityContainer. A través de notas MusicPlayer con @Inject, Básicamente le estamos diciendo al contenedor cómo proporcionar una instancia del tipo MusicPlayer.

En Actividad, necesitamos crear una instancia del contenedor y usarla para completar las dependencias de la Actividad.Esto es lo que hizo Hilt al anotar la actividad. @AndroidEntryPoint.

Hasta ahora, hemos visto que cuando @Inject Usado para anotar el constructor de una clase, le dice a Hilt cómo proporcionar una instancia de la clase.Cuando anota una variable @AndroidEntryPoint Clase anotada, Hilt inyectará una instancia del tipo en la clase.

@AndroidEntryPoint, Puede anotar la mayoría de las clases del marco de Android, no solo las actividades, crear una instancia dependiente del contenedor para esta clase y completar todas @Inject Anotar variables.

@HiltAndroidApp Anotación Application Class, además de activar la generación de código de Hilt, también crea un contenedor de dependencia asociado con la clase Application.

Ahora que hemos entendido los conceptos básicos de Hilt, compliquemos el ejemplo. ahora, MusicPlayer Acepta dependencias en su constructor, MusicDatabase.

Por lo tanto, debemos decirle a Hilt cómo proporcionar MusicDatabase. Por ejemplo, cuando el tipo es una interfaz o no eres el propietario de la clase (porque proviene de una biblioteca), no puedes usar @Inject!

Supongamos que usamos Room como una biblioteca de persistencia en nuestra aplicación.Volver a nuestra implementación manual PlayActivityContainer, Cuando se proporciona MusicDatabasePara Room, esta será una clase abstracta y queremos ejecutar algún código al proporcionar dependencias.Entonces, cuando se proporciona una instancia MusicPlayer, Necesitamos llamar para brindar o satisfacer MusicDatabase Dependencia.

No necesitamos preocuparnos por las dependencias transitivas en Hilt, porque conectará automáticamente todas las dependencias transitivas.Sin embargo, debemos dejarle saber cómo proporcionar una instancia del tipo MusicDatabasePara ello utilizamos el módulo Hilt.

Un módulo Hilt es una clase anotada @ModuleEn la clase, podemos tener algunas funciones para decirle a Hilt cómo proporcionar ciertos tipos de instancias. La información que conoce Hilt también se llama Unir Utilice terminología de portaherramientas.

Función anotada @Provides Dígale a Hilt cómo proporcionar MusicDatabase escribe. El cuerpo contiene el bloque de código que Hilt necesita ejecutar, que es exactamente el mismo que el bloque de código en nuestra implementación manual.

Tipo de retorno, MusicDatabase, Notificar Hilt del tipo proporcionado por esta función. Y el parámetro de función le dice a Hilt la dependencia del tipo correspondiente, en este caso, ApplicationContext Ya disponible en Hilt.Este código le dice a Hilt cómo proporcionar MusicDatabase Escriba, o en otras palabras, tenemos un Atado por MusicDatabase.

También se utiliza el módulo portaherramientas @InstallIn Un comentario que indica en qué contenedores o componentes de dependencia está disponible esta información. Pero, ¿qué es un componente? Vamos a presentarlo con más detalle.

Un componente es una clase generada por Hilt y es responsable de proporcionar una instancia del tipo, al igual que un contenedor que programamos manualmente. En el momento de la compilación, Hilt recorre el gráfico de dependencia de la aplicación y genera código para proporcionar sus dependencias transitivas a todos los tipos.

El componente es una clase generada por Hilt y es responsable de proporcionar instancias del tipo

Hilt genera un componente o contenedor dependiente para la mayoría de las clases de marco de Android. La información o la vinculación de cada componente se propaga a través de la jerarquía de componentes.

LEER  Esto es lo que necesita saber sobre Windows 11 antes de instalar | Autor: Monafboyoud | Julio de 2021

Publicaciones relacionadas

Deja una respuesta

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

Botón volver arriba