单例组件不能依赖于范围组件

Sus*_*mar 13 android dagger-2

在使用dagger2处理依赖注入的android应用程序同时定义dagger组件时,我收到此错误

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

我的组件代码在这里:

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

我遇到错误的成分代码是:

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

为什么会出现此错误以及如何解决此问题.

dmi*_*sev 12

WebserviceComponent并且RemoteDataSourceComponent不能有相同的范围.在匕首2中,范围定义了类似生命周期的东西,并且@Singleton是最广泛的.因此,如果RemoteDataSourceComponent依赖WebserviceComponent,这意味着WebserviceComponent可以活得更久.


Rum*_*raK 12

尽管dmitriyzaitsev的答案说明了为什么会出现错误,但以下是解决方法:

  1. 定义自己的范围(它实际上也将像Singleton范围一样)。例如,一个名为的文件RemoteDataScope.java

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用新范围,例如,@RemoteDataScope而不是@Singleton在您的中RemoteDataSourceComponent

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