在使用 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();
}
为什么我会收到此错误以及如何解决此问题?
虽然 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
替换为 WebService
以获得 RemoteDataSourceComponent
依赖项:
@Singleton
@Component(modules = {RemoteDataModule.class}, dependencies = {WebService.class})
public interface RemoteDataSourceComponent {
RemoteDataSource providesRemoteDataSource();
}