Nuevo inyector Android con Dagger 2 – parte 3

Si no has leído la parte 1 y la parte 2, te sugiero que las leas primero. Puedes encontrar los enlaces en la parte inferior.

TLDR;

Puedes usar DaggerActivity, DaggerFragment, DaggerApplication para reducir el boilerplate en tu Activity/Fragment/Application.

También puedes usar AndroidInjector<T> en tus componentes dagger para reducir el boilerplate también.

Recuerda que llamamos a AndroidInjection.inject() cada actividad o fragmento que queramos usar dagger. Y también, si quieres usar Injection en tu fragmento, también debes implementar la interfaz HasSupportFragmentInject y anular el inyector de fragmentos en tu actividad.

Recientemente, moví ese código a mi actividad base y fragmento base. Por qué debo declarar eso para cada actividad? Creo que moverlos a la clase base es aceptable.

Entonces veo algunas clases en el proyecto dagger mientras investigo, DaggerAppCompatActivity y DaggerFragment. Estas clases hace exactamente lo que hice. Android ama la herencia. Así que podemos pretender que nos encanta eso también 😛

Veamos lo que está sucediendo dentro de estas clases de la biblioteca.

DaggerAppCompatActivity

Nada diferente en realidad. Podemos reducir el código boilerplate en nuestra actividad extendiendo nuestra actividad desde DaggerAppCompatActivity.

Nuestra clase DetailActivity era como la siguiente;

Extendámosla desde DaggerAppCompatActivity y eliminemos HasSupportFragmentInjector y el método overrided de nuestra actividad.

Ahora, es mejor.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

Veamos qué más podemos hacer para reducir el código boilerplate. AndroidInjector nos ayuda a simplificar nuestro App Component. Puedes consultar la documentación de AndroidInjector desde aquí.

Veamos nuestro componente de aplicación y la clase de aplicación.

build() y seedInstance() ya están definidos en la clase AndroidInjector.Builder. Así que podemos deshacernos de ellas y extender nuestro Builder desde AndroidInjection.Builder<Application>.

Y también, la interfaz AndroidInjector tiene el método inject() en ella. Así que podemos eliminar el método inject() y extender nuestra interfaz AppComponent desde AndroidInjector<Application>

Así que nuestra interfaz AppComponent actualizada y reducida a boilerplate tendrá el siguiente aspecto

Os habéis dado cuenta de que también hemos cambiado nuestros módulos. He eliminado AndroidInjectionModule.class en los módulos del componente y he añadido AndroidSupportInjectionModule.class. Esto se añade porque utilizamos el apoyo Fragment. AndroidInjectionModule vincula su app.Fragment a dagger. Pero si desea utilizar la inyección en v4.fragment entonces usted debe agregar AndroidSupportInjectionModule.class a sus módulos AppComponent.

Cambiamos a la forma en que inyectamos en nuestro AppComponent. Así que vamos a ver lo que se cambia en nuestra clase Application.

Al igual que en el DaggerActivity y DaggerFragment, también tenemos que extender nuestra clase Application de DaggerApplication.

Nuestra clase Application tenía el siguiente aspecto;

La cambiamos por..

Source

Puedes encontrar esta implementación simplificada como rama en mi página de github. No estoy fusionando eso en el maestro porque quiero mostrar la manera de la vieja escuela para usar daga en cada rama. Así que los lectores pueden seguir un camino de la manera de la vieja escuela a la manera simplificada.

PS.

Leave a Reply