单一实例组件不能依赖于作用域内的组件



在定义dagger组件时使用Dagger2进行依赖项注入的Android应用程序时,我收到此错误

Error:(13, 1) error: This @Singleton component cannot depend on scoped components:
@Singleton com.eaxample.app.DaggerAndroid.networkhandler.WebserviceComponent

我的组件代码在这里:

@Singleton
@Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
public interface WebserviceComponent {
WebserviceHelper providesWebserviceHelper();
}

我收到错误的组件代码是:

@Singleton
@Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}

为什么我会收到此错误以及如何解决此问题?

虽然dmitriyzaitsev的回答解释了为什么你会得到这个错误,但你可以通过以下方式解决它:

  1. 定义你自己的作用域(它实际上也会像单例作用域一样)。 例如,一个名为RemoteDataScope.java的文件:

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    
  2. 使用新示波器,例如@RemoteDataScope而不是@SingletonRemoteDataSourceComponent

    @RemoteDataScope
    @Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
    public interface RemoteDataSourceComponent {
    RemoteDataSource providesRemoteDataSource();
    }
    

WebserviceComponentRemoteDataSourceComponent不能具有相同的作用域。在dagger 2 中,作用域定义了生命周期之类的内容,@Singleton是最宽的。因此,如果RemoteDataSourceComponent取决于WebserviceComponent,这意味着WebserviceComponent可以活得更久。

另一种解决方案(不定义额外的作用域)是使用"常规"(未注释)接口分隔两个组件。

在您的情况下,请说WebService

public interface WebService {
WebserviceHelper providesWebserviceHelper();
}

使WebserviceComponent扩展WebService

@Singleton
@Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
public interface WebserviceComponent extends WebService {
// empty body now
}

WebserviceComponent替换为RemoteDataSourceComponent依赖项的WebService

@Singleton
@Component(modules = {RemoteDataModule.class}, dependencies = {WebService.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}

最新更新