2017-02-27 5 views
0

ダガー2のセットアップを開始しましたが、バグのような奇妙な問題に直面しました。オブジェクトは@アノテーション付きのメソッドなしでは提供できません

私は1つの主成分と1つの副成分を持っていますが、それは親成分でプラスです。

私が使用します。

compile "com.google.dagger:dagger:2.4" 
apt "com.google.dagger:dagger-compiler:2.4" 
annotationProcessor "com.google.dagger:dagger-compiler:2.4" 

アプリケーションコンポーネントはprety簡単です。それだけ 'プラス' 副成分:

@Singleton @Component(modules = { AristocratsAppModule.class }) 
public interface AristocratsAppComponent { 
    StreamComponent plus(StreamModule module); 
} 

アプリケーションモジュールも非常に基本的な。これは、アプリケーションレベルの依存関係を提供する:

@Module public class AristocratsAppModule { 
    private static AristocratsApp app; 

    public AristocratsAppModule(AristocratsApp app) { 
    AristocratsAppModule.app = app; 
    } 

    @Provides @Singleton AristocratsApp providesApplication() { 
    return app; 
    } 

    @Provides @Singleton GsonXml providesGsonXml() { 
    return ... 
    } 

    @Provides @Singleton @Named("aristocrats") Retrofit providesAristocratsRetrofit() { 
    return ... 
    } 

    @Provides @Singleton @Named("last_fm") Retrofit providesLastFmRetrofit() { 
    return ... 
    } 
} 

サブコンポーネントは、二つStreamServices(レトロフィットサービス)と単純な注入を有する:サブコンポーネントの

@PerController @Subcomponent(modules = { StreamModule.class }) public interface StreamComponent { 
    void inject(StreamsController streamsController); 

    AristocratsStreamService providesAristocratsStreamService(); 

    LastFmStreamService providesLastFmStreamService(); 
} 

モジュールプレゼンタ注入およびレトロフィットサービスの二つの異なる注射剤を提供します。

@Module public class StreamModule { 
    private StreamsController mView; 

    public StreamModule(StreamsController view) { 
    mView = view; 
    } 

    @Provides @PerController StreamMvp.Presenter providesPresenter(StreamCase streamCase, 
     StreamModelMapper streamMapper) { 
    return new StreamPresenter(mView, streamCase, streamMapper); 
    } 

    @Provides @PerController AristocratsStreamService providesAristocratsStreamService(
     @Named("aristocrats") Retrofit retrofit) { 
    return retrofit.create(AristocratsStreamService.class); 
    } 

    @Provides @PerController LastFmStreamService providesLastFmStreamService(
     @Named("last_fm") Retrofit retrofit) { 
    return retrofit.create(LastFmStreamService.class); 
    } 
} 

Applicat私のアプリクラスの私はのonCreate(に呼び出すイオン注入):私は私のコントローラで呼び出す

mAppComponent = DaggerAristocratsAppComponent.builder() 
     .aristocratsAppModule(new AristocratsAppModule(this)) 
     .build(); 

ビュー注入:私は、ビルド時に取得しています

getAppComponent().plus(new StreamModule(this)).inject(this); 

が例外:

Error:(13, 8) error: [com.qsoft.streams.presentation.di.StreamComponent.inject(com.qsoft.streams.presentation.StreamsController)] com.qsoft.streams.data.network.AristocratsStreamService cannot be provided without an @Provides-annotated method. 
com.qsoft.streams.data.network.AristocratsStreamService is injected at 
com.qsoft.streams.data.network.StreamApi.<init>(…, streamServiceAristocrats, …) 
com.qsoft.streams.data.network.StreamApi is injected at 
com.qsoft.streams.data.repository.StreamRepository.<init>(streamApi, …) 
com.qsoft.streams.data.repository.StreamRepository is injected at 
com.qsoft.streams.domain.interactors.StreamCase.<init>(streamRepository) 
com.qsoft.streams.domain.interactors.StreamCase is injected at 
com.qsoft.streams.presentation.di.StreamModule.providesPresenter(streamCase, …) 
com.qsoft.streams.presentation.StreamMvp.Presenter is injected at 
com.qsoft.streams.presentation.StreamsController.mPresenter 
com.qsoft.streams.presentation.StreamsController is injected at 
com.qsoft.streams.presentation.di.StreamComponent.inject(streamsController) 
A binding with matching key exists in component: com.qsoft.streams.presentation.di.StreamComponent 

エラーは@Provides-annotated methodが見つからないと苦情を言いますが、それらは私の子モジュールの中にあります。 Dagger2はそれらを見ないと思う。問題がサブコンポーネント内のAristocratsStreamServiceの宣言が欠けている可能性があると私は考えていました。

この状況は非常に奇妙に見えます。経験豊富なDagger2開発者からのインプットを聞きたいと思います。

ありがとうございます!

答えて

0

あなたはAristrocratsModuleにサブコンポーネントの一部を設定していないことに気付きました。

この:この中

@Module public class AristocratsAppModule { 

@Module(subcomponents = {StreamComponent.class}) 
public class AristocratsAppModule { 

は、次の変更を行うようにしてください。 StreamComponentでBuilderを作成します。

@Subcomponent.Builder 
interface Builder { 
    Builder streamModule(StreamModule module); 

    StreamComponent build(); 
} 

最終的にStreamComponent経由ですべてを注入し、すべてをAristocratsAppComponentに注入します。

public StreamComponent getStreamComponent(Controller controller) { 
    return getAppComponent().streamBuilder().streamModule(new StreamModule(controller)).build(); 
} 

これ以降プラスのものは削除できます。

+0

私は試みましたが、エラーは同じです。それはそれを取り除かなかった。 – Val

関連する問題