Android 如果没有@Providers注释方法,则无法提供对象

Android 如果没有@Providers注释方法,则无法提供对象,android,dependency-injection,retrofit2,dagger-2,inject,Android,Dependency Injection,Retrofit2,Dagger 2,Inject,我已经开始安装匕首2,并且面临着一个奇怪的问题,对我来说这看起来像一个bug 我有一个主组件和一个子组件,我在父组件中加上了它们 我使用: compile "com.google.dagger:dagger:2.4" apt "com.google.dagger:dagger-compiler:2.4" annotationProcessor "com.google.dagger:dagger-compiler:2.4" 应用程序组件非常简单。它只是“加上”子组件: @Singleton @C

我已经开始安装匕首2,并且面临着一个奇怪的问题,对我来说这看起来像一个bug

我有一个主组件和一个子组件,我在父组件中加上了它们

我使用:

compile "com.google.dagger:dagger:2.4"
apt "com.google.dagger:dagger-compiler:2.4"
annotationProcessor "com.google.dagger:dagger-compiler:2.4"
应用程序组件非常简单。它只是“加上”子组件:

@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(改装服务)和simple inject:

@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);
  }
}
我在应用程序类的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
错误:(13,8)错误:[com.qsoft.streams.presentation.di.StreamComponent.inject(com.qsoft.streams.presentation.streamscocontroller)]com.qsoft.streams.data.network.贵族StreamService在没有@Provides注释方法的情况下无法提供。
com.qsoft.streams.data.network.贵族流服务在
com.qsoft.streams.data.network.StreamApi.(…,streamservicepoligates,…)
com.qsoft.streams.data.network.StreamApi在
com.qsoft.streams.data.repository.StreamRepository.(streamApi,…)
com.qsoft.streams.data.repository.StreamRepository在
com.qsoft.streams.domain.interactiors.StreamCase.(streamRepository)
com.qsoft.streams.domain.interactitors.StreamCase在
com.qsoft.streams.presentation.di.StreamModule.ProviderPresenter(streamCase,…)
com.qsoft.streams.presentation.StreamMvp.Presenter在
com.qsoft.streams.presentation.StreamsController.mPresenter
com.qsoft.streams.presentation.StreamsController在
com.qsoft.streams.presentation.di.StreamComponent.inject(streamsController)
组件中存在具有匹配键的绑定:com.qsoft.streams.presentation.di.StreamComponent
有关缺少
@的错误投诉提供了带注释的方法
,但它们位于我的子模块内。看来Dagger2根本看不到他们。我认为问题可能在于子组件中缺少
贵族流服务
的声明,所以我甚至在那里添加了它,但没有任何更改

这种情况看起来很奇怪,我想听听更有经验的Dagger2开发人员的意见


提前谢谢你

我注意到您没有在AristrocratsModule中设置子组件部分

这:

为此:

@Module(subcomponents = {StreamComponent.class})
public class AristocratsAppModule {
尝试进行以下更改。在StreamComponent中创建一个生成器

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

    StreamComponent build();
}
最终,您将通过StreamComponent注入所有内容,并且它也会将所有内容注入到AppComponent中

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

另外,在此之后可以删除该内容。

我尝试过,但错误相同。它没有移除它。
public StreamComponent getStreamComponent(Controller controller) {
    return getAppComponent().streamBuilder().streamModule(new StreamModule(controller)).build();
}