Los objetos inyectados se convirtieron en nulos después de actualizar a Roboguice 3

Acabo de actualizar nuestro proyecto para utilizar Roboguice 3 y de repente todos los objetos inyectados se convirtió en nulo, que incluye POJO, proveedores, vistas, recursos, etc Y estoy luchando para averiguar por qué.

En primer lugar hay el archivo de compilación gradle, probado tanto Proguard y fuera y no hizo la diferencia. Creo que estamos utilizando actualmente Roboguice 3.0.1, pero intenté 3.0 y todavía tenía el problema.

compile ('org.roboguice:roboguice:3.+') { exclude module: 'asm' } provided 'org.roboguice:roboblender:3.+ 

Y tenemos algunos enlaces personalizados en un archivo de módulo, así que aquí es cómo lo estoy especificando de acuerdo a la wiki:

 <meta-data android:name="roboguice.modules" android:value="com.some.CustomModule"/> 

Solo para que conste, también he intentado especificarlo en la clase Aplicación como esto y no funcionó:

 RoboGuice.getOrCreateBaseApplicationInjector( this, RoboGuice.DEFAULT_STAGE, RoboGuice.newDefaultRoboModule(this), new CustomModule(this)); 

Eso es todo para la configuración, no cambiamos nada y si utilizo Roboguice 2, todo funciona.

Un par de otras cosas que también he intentado:

  1. También intentado sin Roboblender y anotación db RoboGuice.setUseAnnotationDatabases(false); No hizo la diferencia.
  2. Ln.d("Test" + Strings.toString(0)); Esto registra impresiones apenas fino así que pienso que la biblioteca real se embala a la derecha.
  3. En lugar de inyectar un proveedor de un POJO, traté de usar la inyección manual como este RoboGuice.getInjector(this).getInstance(SharedPreferencesHelper.class); Y arroja el error acerca de Could not find a suitable constructor in some.path.SharedPreferencesHelper. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. Could not find a suitable constructor in some.path.SharedPreferencesHelper. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private. Lo extraño es que en la clase SharedPreferencesHelper tenemos un constructor público con @Inject anotado, supongo que de alguna manera no se tiene en cuenta? Tal vez todo este problema se debe a la anotación no se considera?

He estado golpeando mi cabeza contra ella durante un par de días y realmente apreciaría cualquier entrada o más cosas para probar.

Agregar esto a la clase de aplicación resolverá el problema inmediato. También debería funcionar si se agrega a la actividad de lanzamiento predeterminada.

 static { RoboGuice.setUseAnnotationDatabases(false); } 

La clase AnnotationDatabaseImpl es generada por Roboblender en tiempo de compilación.

Cómo funciona la base de datos de anotaciones:

El argumento del compilador "guiceAnnotationDatabasePackageName" decide qué paquete se asigna a la clase AnnoationsDatabaseImpl generada.

Para las compilaciones de maven:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler.version}</version> <configuration> <compilerArgument>-AguiceAnnotationDatabasePackageName=some.package.name.here</compilerArgument> <source>${java.version}</source> <target>${java.version}</target> <fork>true</fork> </configuration> 

A continuación, en el manifiesto de aplicación, dentro del elemento de aplicación, agregue una etiqueta de meta datos que haga referencia a la clase generada.

 <meta-data android:name="roboguice.annotations.packages" android:value="some.package.name.here"/> 

Si realiza estos cambios y está utilizando intellij, a continuación, volver a importar su Maven pom aplicará estos cambios. Alternativamente, en Intellij puede asignar un argumento de compilador para obtener la anotación que se va a crear.

Esto iría bajo Parámetros de línea de comando adicionales en Configuración / Generación, Ejecuciones, Implementación / Compilador de Java

-AguiceAnnotationDatabasePackageName = some.package.name.here

Espero que esto ayude y te salve un poco de pena 🙂

Tengo el mismo error al usarlo con gradle y Android Studio

He añadido lo siguiente al archivo build.gradle:

 allprojects { gradle.projectsEvaluated { tasks.withType(JavaCompile) { options.compilerArgs << "-AguiceAnnotationDatabasePackageName=com.android.app.sample" } } } 

Agregó lo siguiente a AndroidManifest.xml:

 <meta-data android:name="roboguice.annotations.packages" android:value="com.android.app.sample"/> 

El problema se puede resolver pasando en el contexto correctamente. Si está extendiendo la clase de aplicación entonces Inyecte un Contexto usando roboguice y luego cuando esté inyectando POJOs luego pase el contexto en ellos.

Esto funcionó para mí.

– Shiv

  • Robolectric + PowerMock + Mockito no funciona
  • Roboguice inyección en el adaptador
  • ORMLite para Android: enlazar DAO con Roboguice
  • Android: Cómo ampliar mi clase de actividad con RoboActivity + ActionBarActivity
  • ¿Cómo se inyecta impl de alguna interfaz en una actividad de Android utilizando Guice
  • RoboGuice unidad de prueba de inyección de módulo de aplicación en lugar de módulo de prueba
  • Mantenga la clase anotada en Proguard
  • Roboguice: el uso de las inyecciones manuales causa ConfigurationException (no se ha vinculado la implementación)
  • OnViewCreated con la biblioteca de compatibilidad
  • Uso de RoboFragment con FragmentManager
  • Aplicación para Android con RoboGuice 2.0 - Cómo inyectar un singleton con el contexto de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.