2017-02-27 1 views
0

단검 2를 설치하기 시작했고 버그와 같은 이상한 문제에 직면했습니다.@ 제공하는 주석이 달린 메서드가 없으면 개체를 제공 할 수 없습니다.

나는 부모 구성 요소에 1을 더한 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(); 
내 컨트롤러에 전화를

보기 주입 :

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 
: 나는 빌드하는 동안 받고 있어요

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

예외

누락 된 항목에 대한 오류는 @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

관련 문제