Título del artículo De RoboGuice a Dagger 2, Parte 4 (Extras)

De RoboGuice a Dagger 2 – Parte 4 (Extra, otros problemas)

Esta es la cuarta parte de los tres artículos anteriores sobre cómo realizar la migración del inyector de dependencias RoboGuice a Dagger 2. Puedes leer el resto de artículos aquí:

LayoutInflater y Context inyectados

Uno de los problemas que surgió durante la migración fue el hecho de que algunas vistas perdían la fuente que había sido asignada mediante la librería Calligraphy. Este problema está relacionado con el LayoutInflater utilizado para inflar las vistas. Calligraphy funciona de la siguiente manera: se inicia Calligraphy en la clase aplicación y se sobrescribe el método attachBaseContext() en todas las activities para pasarle un CalligraphyContextWrapper: Esto envuelve el contexto de la activity para que todos los TextViews y EditTexts utilicen la fuente miFuente.ttf o puedan usar otra indicándola en el atributo nombreAtributoParaFuente. Es decir, que tanto el layout de la activity como el de cualquier vista que inflemos utilizando un LayoutInflater obtenido mediante el contexto de esta misma activity utilizarán esa fuente.

El problema

El problema surge cuando inyectas el LayoutInflater. RoboGuice te permite inyectar determinadas clases del sistema operativo sin necesidad de hacerlas inyectables tú mismo. Una de ellas es LayoutInflater. No sé cómo obtiene la instancia, pero la cuestión es que la crea mediante un contexto que ya ha sido envuelto en en el CalligraphyContextWrapper. De esta forma, puedes usarlo sin problema ninguno y los TextViews y EditTexts se cargarán con su fuente correspondiente. Así, este ejemplo con RoboGuice funciona correctamente: (A mí también me parece ridículo inyectar el contexto cuando ya lo tienes a la hora de inicializar la inyección, pero así estaba hecho). Sin embargo, con Dagger no podemos inyectar un LayoutInflater a menos que lo hagamos inyectable nosotros mismos, y en dicho caso, para obtenerlo solo podríamos utilizar el contexto de la aplicación: Esto hará que estés inyectando un LayoutInflater que no ha sido creado con un contexto envuelto en el CalligraphyContextWrapper, por lo que si lo usas, la vista que infles no tendrá aplicada esta fuente ni en sus TextViews ni EditTexts.

Solución

La solución es tan simple como detectar dónde estás inflando vistas con un LayoutInflater inyectado y pasarle en su lugar el contexto de la activity y obtenerlo a partir de este: Fíjate además, y es muy importante, en que el campo mContext ya no es inyectado. Si lo hubiera sido, habríamos estado en las mismas, ya que estaríamos utilizando un contexto que verdaderamente es la clase aplicación, el cual no tiene aplicado el CalligraphyContextWrapper.

Inyección en clases genéricas

Una limitación de Dagger es que no se puede inicializar la inyección en una clase genérica. Por ejemplo: Si intentamos ejecutar este código, obtendremos este error: Dagger nos está avisando de que no es posible inicializar la inyección en clases genéricas. Es decir no puede resolver ni la dependencia de OtroCampo que viene en el constructor ni la dependencia de CampoInyectado porque no acepta que se pueda inyectar nada en MiClase.

Solución

Para solucionar esto, lo primero que tenemos que hacer es eliminar el método inject(MiClase miClase) del componente, que es quien provoca este mensaje: Y ahora tendremos que resolver las dependencias de otra manera. La solución que proponemos es la de utilizar la inyección puntual: Es decir, ahora la clase sigue siendo inyectable, pero las dependencias se inicializan mediante métodos provider expuestos en el componente: Recuerda que, para que este tipo de inyección funcione, las clases CampoInyectable y OtroCampo tienen que ser inyectables, mediante un método provider o mediante la anotación @Inject en sus constructores.
0 Comentarios

Contesta

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

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

©2019 Codictados Comunidad libre para el aprendizaje de codigo Online

o

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

o

Create Account