Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 单例组件不能依赖于作用域组件_Android_Dagger 2 - Fatal编程技术网

Android 单例组件不能依赖于作用域组件

Android 单例组件不能依赖于作用域组件,android,dagger-2,Android,Dagger 2,在定义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

在定义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();
}

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

WebserviceComponent
RemoteDataSourceComponent
不能具有相同的作用域。在dagger 2中,作用域定义了类似生命周期的东西,
@Singleton
是最广泛的。因此,如果
RemoteDataSourceComponent
依赖于
WebserviceComponent
,这意味着
WebserviceComponent
可以活得更长。

dmitriyzaitsev的回答解释了出现错误的原因,下面是解决方法:

  • 定义您自己的范围(实际上它的行为也类似于单例范围)。例如,一个名为
    RemoteDataScope.java
    的文件:

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    

  • 远程数据源组件中使用新的作用域,例如
    @RemoteDataScope
    而不是
    @Singleton

    @RemoteDataScope
    @Component(modules = {RemoteDataModule.class}, dependencies = {WebserviceComponent.class})
    public interface RemoteDataSourceComponent {
           RemoteDataSource providesRemoteDataSource();
    }
    
  • 另一个解决方案(不定义额外的作用域)是使用“常规”(未注释)接口分离两个组件

    在您的情况下,可以说
    WebService

    public interface WebService {
        WebserviceHelper providesWebserviceHelper();
    }
    
    @Singleton
    @Component(modules = {WebserviceModule.class}, dependencies = {ApplicationComponent.class})
    public interface WebserviceComponent extends WebService {
        // empty body now
    }
    
    制作
    WebserviceComponent
    扩展
    WebService

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

    对于
    RemoteDataSourceComponent
    依赖项,将
    WebserviceComponent
    替换为
    WebService

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

    RemoteDataSourceComponent
    应该有。我需要在Kotlin中使用
    @Retention(AnnotationRetention.RUNTIME)