Hola, soy Luis y esta vez les traigo este tutorial.
El equipo de Android ha expresado cada vez más su apoyo a Inyección de dependencia marcos como Dagger , yendo tan lejos como para desarrollar y recomendar Hilt – su marco Android DI construido sobre Dagger – para el desarrollo moderno de Android.
En su guía de inyección de dependencia manual el equipo de Android presenta enfoques para DI manual para modelos de vista. Ofrecen el enfoque básico de DI manual: simplemente instancian todo lo que necesita en onCreate
y usando lateinit var
.
Ver modelos y el enfoque del contenedor mediante un AppContainer
para manejar las dependencias en todas sus actividades.
La alternativa que le dan a este enfoque de placa de caldera pesada es recomendar Dagger o Hilt para manejar este proceso por usted. Sin embargo, en muchas aplicaciones, incorporar un marco de DI es una sobrecarga que realmente no necesita.
En cambio, ¿qué pasaría si hubiera una manera de inyectar dependencias manualmente en sus modelos de vista de fragmentos y actividad de Android sin toda la placa de la caldera?
Índice
Lazy DI
usando extensiones de ViewModel
del ciclo de vida de Android
Una de las formas en que los equipos de Fragmento y ciclo de vida de Android han intentado hacer que el modelo de vista sea más fácil de usar en actividades y fragmentos es proporcionar la biblioteca de Extensiones de Android Lifecycle ViewModel Kotlin.
Esta biblioteca le permite crear una instancia de un modelo de vista en un fragmento o actividad con un método delegado, lo que facilita la creación de un modelo de vista con el alcance adecuado.
¡Esto es hermoso! Sin embargo, ¿qué pasa si nuestro modelo de vista necesita usar un repositorio hacer una llamada a Modernización? Nos gustaría inyectar ese repositorio en nuestro modelo de vista cuando lo construimos.
Ver fábrica de proveedores de modelos
Una forma de habilitar este comportamiento es usar ViewModelProvider.Factory
, con el que puede crear una instancia de un modelo de vista con las dependencias necesarias.
Para hacerlo, necesita crear su propia Fábrica que amplíe el ViewModelProvider.Factory
interfaz, o crear una función que pueda devolver un object
que anula el Factory.create
método.
Si quisiéramos detenernos aquí, podríamos crear una función de Kotlin para hacer esto por nosotros:
Y utilícelo en nuestra Actividad o Fragmento así:
¡Ahora podemos crear un modelo de vista con las dependencias necesarias! Sin embargo, incluso con nuestra Fábrica abstraída en una función, todavía necesitamos administrar la placa de la caldera de ViewModelProvider
.
Ver proveedor de modelos
y mashup
de extensión de Kotlin
Recuerde, podríamos usar by viewModels
o by activityViewModels
para delegar la creación de nuestros modelos de vista, pero no pudimos inyectar nuestras dependencias requeridas sin una fábrica.
Ahora que tenemos una forma práctica de crear una instancia de un modelo de vista con una fábrica, podemos permitir que estas extensiones de Kotlin para el modelo de vista oculten esto ViewModelProvider
placa de caldera. Así es como se vería en un Fragmento.
Casi perfecto. Todo lo que tenemos que hacer es proporcionar una fábrica y una lambda que devuelva nuestro modelo de vista. Pero, con un poco de ayuda del lifecycle-viewmodel-ktx
biblioteca y funciones de extensión de Kotlin, podemos dar un paso más.
Fin del juego: modelo DI Easy View
Usemos el poder de las funciones de extensión, nuestro conocimiento de Factory y la ViewModelLazy
class para delegar la creación de nuestro modelo de vista a funciones en Actividad y Fragmento.
Proporcionamos la función para crear nuestro modelo de vista como una lambda que devuelve el tipo <VM : ViewModel>
, el viewModelBuilder
y activityViewModelBuilder
y las extensiones hacen el resto.
Ahora, en nuestra Actividad:
O Fragmento:
Podemos construir fácilmente un ViewModel, junto con todas sus dependencias necesarias, ¡todo sin la molesta repetición!
Si se encuentra en una situación en la que necesita modelos de vista de Android complejos, desea seguir los principios SÓLIDOS de inyección de dependencia y no está del todo listo para adoptar la complejidad de un marco de inyección de dependencia completo; con suerte, esto ayudará a presentar algunas otras opciones que puede facilitar la gestión de la tarea.
El código de esta publicación se ha convertido en una biblioteca para facilitar su uso / mantenimiento. Si prefiere simplemente importar y listo, compruébelo en GitHub:
Gracias por leer este tutorial.
Añadir comentario