在使用dagger2处理依赖注入的android应用程序时,在定义dagger组件时我收到此错误
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();
}
为什么会出现此错误以及如何解决此问题。
答案 0 :(得分:7)
WebserviceComponent
和RemoteDataSourceComponent
不能具有相同的范围。在匕首2中,范围定义类似于生命周期,@Singleton
是最宽的。因此,如果RemoteDataSourceComponent
取决于WebserviceComponent
,则表示WebserviceComponent
可以延长使用时间。
答案 1 :(得分:6)
虽然dmitriyzaitsev的答案说明了为什么会出现错误,但可以通过以下方法解决它:
定义您自己的作用域(它实际上也将像Singleton作用域一样)。例如。名为RemoteDataScope.java
的文件:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface RemoteDataScope {
}
使用新作用域,例如@RemoteDataScope
中的@Singleton
而不是RemoteDataSourceComponent
:
@RemoteDataScope
@Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}
答案 2 :(得分:2)
另一种解决方案(不定义额外的作用域)是使用“常规”(未注释)接口分离两个组件。
在您的情况下,请说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
的{{1}}替换为WebService
的依存关系:
RemoteDataSourceComponent