在定义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的回答解释了为什么你会得到这个错误,但你可以通过以下方式解决它:
-
定义你自己的作用域(它实际上也会像单例作用域一样)。 例如,一个名为
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(); }
WebserviceComponent
和RemoteDataSourceComponent
不能具有相同的作用域。在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();
}