@Named proveedores con los mismos tipos de retorno terminan dando java.lang.IllegalArgumentException: Duplicar
Aquí está el problema,
Estoy trabajando en un proyecto de LibGDX donde tengo diferentes módulos para diferentes plataformas.
- ¿Cómo guardar correctamente el progreso del juego a través de las preferencias de libGDX en dispositivos Android?
- Renderizado de vídeo en una textura en LibGDX
- Libgdx en el escritorio, cómo manejar la eliminación cuando la ventana está cerrada
- Cómo comprobar si un cuerpo casi ha dejado de moverse en libgdx + box2d
- Uso de scene2d.ui con libgdx: ¿De dónde proviene la piel?
Así es como se ve mi módulo android:
@Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectActivity.class, DummyProject.class}, overrides = true) public class DummyProjectAndroidModule { ... @Provides @Singleton @Named("DummyOne") DummyInterface provideDummyOne() { return new DummyOne(); } @Provides @Singleton @Named("DummyTwo") DummyInterface provideDummyTwo() { return new DummyTwo(); } @Provides @Singleton @Named("DummyConsumer") DummyConsumer provideDummyConsumer(@Named("DummyOne") DummyInterface dummyOne, @Named("DummyTwo") DummyInterface dummyTwo) { return new DummyConsumer(dummyOne, dummyTwo); } }
.. y aquí cómo se ve mi módulo de escritorio:
@Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectDesktop.class, DummyProject.class}, overrides = true) public class DummyProjectDesktopModule {
Así descansar es más o menos lo mismo. Sin embargo, mientras estoy construyendo el proyecto para Desktop todo va bien y dandy donde en Android lado, me sale este error que me deja flabbergasted todavía.
Process: net.alicanhasirci.mobile.DummyProject.android, PID: 4603 java.lang.RuntimeException: Unable to start activity ComponentInfo{net.alicanhasirci.mobile.DummyProject.android/net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity}: java.lang.IllegalArgumentException: Duplicate: net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) at android.app.ActivityThread.access$800(ActivityThread.java:148) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) Caused by: java.lang.IllegalArgumentException: Duplicate: net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() at dagger.internal.UniqueMap.put(UniqueMap.java:29) at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.handleBindings(ReflectiveModuleAdapter.java:104) at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.getBindings(ReflectiveModuleAdapter.java:89) at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:174) at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:132) at dagger.ObjectGraph.create(ObjectGraph.java:129) at net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity.onCreate(DummyProjectActivity.java:137) at android.app.Activity.performCreate(Activity.java:5977) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258)
Ahora un rápido vistazo al código fuente de la daga y puedo ver que las anotaciones de calificador se recopilan por reflexión y se utilizan como prefijos para los nombres de enlace que más tarde se utilizarán como claves en UniqueMap. Mi problema parece ocurrir en alguna parte alrededor de esta área donde mi calificador no consigue procesado de alguna manera, con todo mi estructura del escritorio trabaja sin un problema …
Éstos son algunos más adicionales:
ObjectGraph objectGraph = ObjectGraph.create(new DummyProjectAndroidModule()); objectGraph.inject(this); dp = objectGraph.get(DummyProject.class);
Es cómo obtengo mi objeto DummyProject
, que tiene una inyección de campo de DummyConsumer
. Como tal:
@Inject @Named("DummyConsumer") DummyConsumer consumer;
He cambiado los tipos de retorno a las clases concretas como una solución, pero a nadie le gusta una solución porque todos sabemos que te persiguen hasta el final.
- Crear gran Jar (escritorio) de android / escritorio gdx proyecto
- Cómo obtener un archivo de directorio y el ClassLoader para un juego de Android libGDX
- Libgdx app.exit () en Android no se cierra la aplicación
- Android Studio Libgdx Problemas de memoria
- Cómo utilizar los servicios de juegos de Google Play con LibGdx
- Desenfoque la pantalla en LibGDX
- Importar proyecto de gradle, error de android
- Girar la imagen en sentido horario usando LibGDX
Por fin he descubierto la razón por la que ocurre este problema. Es Proguard. A menos que diga especificar de lo contrario en el archivo de configuración proguard, se obfuscate el código generado durante la poda de anotaciones y lo que no causará resultados inesperados.
La única manera de hacer que Proguard y Dagger coexistan es básicamente abandonar la mayor parte de la ofuscación o cambiar a Dagger2, como dijo Jake Wharton en https://github.com/square/dagger/issues/202 . Estoy usando proguard sólo para evitar golpear límite de 65k por lo que la configuración necesaria para evitar la ofuscación resuelto mi problema.