studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java android dependency-injection libgdx dagger

programacion - Los proveedores @Named con los mismos tipos de devolución terminan dando java.lang.IllegalArgumentException: Duplicar



manual de programacion android pdf (1)

Finalmente he descubierto la razón por la que ocurre este problema. Es Proguard. A menos que diga que especifique lo contrario en el archivo de configuración de proguard, ocultará el código generado mientras recorta las anotaciones y lo que no, lo que causará resultados inesperados.

La única forma de hacer que coexistan Proguard y Dagger es básicamente renunciar a la mayoría de la ofuscación o cambiar a Dagger2, como dijo Jake Wharton en https://github.com/square/dagger/issues/202 . Estoy usando proguard solo para evitar alcanzar el límite de 65k, así que hacer las configuraciones necesarias para evitar la ofuscación solucionó mi problema.

Aquí está el problema,

Estoy trabajando en un proyecto LibGDX donde tengo diferentes módulos para diferentes plataformas.

Así es como se ve mi módulo de 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 {

Bueno, el resto es casi lo mismo. Sin embargo, mientras estoy creando el proyecto para escritorio, todo va bien y elegante en el lado de Android, recibo este error que me deja atónito.

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 vislumbro rápidamente el código fuente de la daga y puedo ver que las anotaciones del calificador se recopilan por reflexión y se usan como prefijos para los nombres de enlace que luego se usarán como claves en UniqueMap. Parece que mi problema ocurre en algún lugar alrededor de esta área donde mi calificador no se procesa de alguna manera, pero la compilación de mi escritorio funciona sin problemas ...

Aquí hay 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 clases concretas como solución alternativa, pero a nadie le gusta la solución porque todos sabemos que te persiguen hasta el final.