2015-07-23 25 views
24

İşte konudur@Named sağlayıcılar vererek java.lang.IllegalArgumentException sona:

çoğaltın ben farklı platformlar için farklı modüllere sahip bir LibGDX proje üzerinde çalışıyorum.

@Module(
    includes = {BaseModule.class, NetModule.class}, 
    injects = {DummyProjectDesktop.class, DummyProject.class}, 
    overrides = true) 
public class DummyProjectDesktopModule { 

kuyu dinlenme hemen hemen aynıdır: gibi masaüstü modülü nasıl göründüğünü burada

@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); 
    } 
} 

.. ve: my android modülü nasıl göründüğünü

budur. Yine de masaüstü için bir proje oluştururken her şey Android tarafında nerede güzel ve dandy gider, ben hala beni flabbergasted bırakır bu hata olsun. Şimdi

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) 

hançer kaynak koduna hızlı bir bakış ve ben bu eleme ek açıklamaları yansıma yoluyla toplanmıştır ve daha sonra UniqueMap anahtar olarak kullanılacak isimler bağlanma için önekleri olarak alışmak görebilirsiniz. Benim sorunum İşte

biraz daha ilave vardır ... benim eleme nasılsa işlenmiş almaz, henüz benim masaüstü inşa sorunsuz çalışan bu alanın çevresinde bir yerde meydana geldiği görülmektedir:

ObjectGraph objectGraph = ObjectGraph.create(new DummyProjectAndroidModule()); 
    objectGraph.inject(this); 
    dp = objectGraph.get(DummyProject.class); 

i almak nasıl DummyConsumer alan enjeksiyonu olan DummyProject nesnesinde. Bu itibarla:

@Inject @Named("DummyConsumer") DummyConsumer consumer; 

Ben geçici bir çözüm olarak beton sınıflarına dönüş türleri değişti ama hepimiz onlar sonuna kadar yalnız bırakmaz biliyorum çünkü kimse geçici bir çözüm sevmez.

+4

Lütfen daha güncel bir Hançer sürümüne geçin. –

cevap

0

Sonunda, bu sorunun nedeninin nedenini anladım. Bu Proguard. Proguard yapılandırma dosyasında aksi belirtilmedikçe, ek açıklamaları budayarak ve beklenmeyen sonuçlara neden olacak şekilde oluşturulan kodu gizler.

Proguard ve Dagger'ın bir arada var olmasının bir yolu, temel olarak gizlemenin çoğundan vazgeçmek veya Jake Wharton'un https://github.com/square/dagger/issues/202 numaralı telefondan söylediği gibi Dagger2'ye geçmektir. Ben sadece 65k limit isabet önlemek için proguard kullanıyorum, bu yüzden beni şaşırtmaktan kaçınmak için gerekli yapılandırmaları yapmak sorunu çözdü.

İlgili konular