2017-12-27 57 views
0

나는 이미 내 두 단검 구현의 차이점을 찾으려고 몇 시간을 보냈다. 또한 내가 매핑이 Retrofit 모든 개체를 넣어하기 위해 주석 @IntoMap@RetrofitModulesName(...)를 사용하고,이 방법은 개조 객체를 제공하는이왜 @ Provides-annotated 오류가 발생합니까?

@Module 
class MatchesModule 
{ 
@Provides 
@NetworkScope 
@IntoMap 
@RetrofitModulesName(eRetrofitModules.MATCHES) 
fun retrofitMatches(okHttpClient: OkHttpClient, rxAdaptor: RxJava2CallAdapterFactory, iBuilder: Retrofit.Builder): Retrofit = iBuilder.addConverterFactory(GsonConverterFactory.create(mDeserializerMatches)); 
} 

처럼 구현되었다.

@Module 
class PreviewModule 
{ 
@Provides 
@PreviewScope 
fun provideMatchesPresenter(retrofitModules: Map<eRetrofitModules, Retrofit>): IMatchPresenter = MatchPresenter(retrofitModules) 
} 

나는 모든 Retrofit 객체를 얻고있다 및 MathcPresenter로 전달 모두 확인하고 괜찮습니다. 하지만 제 발표자에 Map<Foo, Provider<Retrovit>>을 받고 싶습니다. 그래서 나는

@Provides 
@PreviewScope 
fun provideMatchesPresenter(retrofitModules: Map<eRetrofitModules, 
Provider<Retrofit>>): IMatchPresenter = MatchPresenter(retrofitModules) 

뿐만 아니라 MathcPresenter

class MatchPresenter(retrofitModules: Map<eRetrofitModules, Provider<Retrofit>>): IMatchPresenter 

의 생성자에 인수로이 단어 Provider을 추가 그리고 지금은 왜 undersand 수는 없지만, 나는 그런 오류가

Error:(6, 1) error: [com.example.alexeyt.sunshinekotlin.moduls.previewmodule.PreviewComponent.inject(com.example.alexeyt.sunshinekotlin.ui.fragments.previewFragments.PreviewFragment)] java.util.Map> cannot be provided without an @Provides-annotated method.


PreviewScope

@Scope 
@Retention(AnnotationRetention.RUNTIME) 
annotation class PreviewScope 

내가 뭘 잘못하고 있니?

+0

무엇이'@ PreviewScope'입니까? –

+0

@DivyeshKalotra는 –

+1

@DivyeshKalotra 질문에 추가했는데 왜 '미리보기 범위'에 대해 물어 보았습니까? 내가 이해하는 한은 중요하지 않습니다 ... 그것은 인수가 –

답변

2

이것은 Kotlin이 제네릭 와일드 카드를 처리하는 방법에 문제가 될 수 있습니다.

Dagger 2 Multibindinds를 사용하는 경우 Dagger (Java Reflection을 사용하여 코드를 분석하고 Component 구현을 생성하는)에서 Map<eRetrofitModules, ? extends Provider<Retrofit>>으로 맵 유형을 해석합니다. 이는 maps in KotlinV 유형 매개 변수가 out으로 표시되어 있기 때문에 발생합니다.

@JvmSuppressWildcards annotation은 컴파일 된 코드에서 해당 정보를 제거합니다. Provider<Retrofit>의 해당 특수 효과를 사용하십시오.

Map<eRetrofitModules, @JvmSuppressWildcards Provider<Retrofit>>

재미있는 내용은 this answer입니다.

+0

에'Provider <> '를 추가 할 때까지 완벽하게 작동합니다. 그래, 도움이되었습니다. 하지만 전에이 솔루션을 발견하고 .. 시도했지만 .. 어쩌면 다른 곳에서. 좋아, 어쨌든 고마워. –