2017-12-27 20 views
0

私はすでに何時間もGoogleで私の2つのダガーの実装の違いを見つけることを試みた。 また、私はマップするために、この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に渡すすべてがOKと罰金です。 しかし私は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を使用してコードを分析し、コンポーネントの実装を生成する)によって解釈されます(Map<eRetrofitModules, ? extends Provider<Retrofit>>)。これは、maps in KotlinVタイプパラメータがoutとマークされているために発生します。

@JvmSuppressWildcards注釈は、コンパイルされたコードからその情報を削除します。 Provider<Retrofit>の注釈を使用してください:

Map<eRetrofitModules, @JvmSuppressWildcards Provider<Retrofit>>

また、this answer興味深いかもしれません。

+0

に 'Provider <>'を追加するまで完全に動作します。それは助けになりました。しかし、私はこの解決策を見つけて試してみましたが、何も...別の場所にいるかもしれません。さて、ありがとう –

関連する問題