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

问题描述 投票:0回答:3

在使用 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();
}

为什么我会收到此错误以及如何解决此问题?

java android dagger-2
3个回答
19
投票

虽然 dmitriyzaitsev 的答案解释了为什么会出现错误,但解决方法如下:

  1. 定义您自己的作用域(它实际上也表现得像单例作用域)。例如。一个名为

    RemoteDataScope.java
    :

    的文件
    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface RemoteDataScope {
    }
    
  2. 使用新范围,例如

    @RemoteDataScope
    而不是
    @Singleton
    中的
    RemoteDataSourceComponent
    :

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

18
投票

WebserviceComponent
RemoteDataSourceComponent
不能具有相同的范围。在 dagger 2 中,范围定义了生命周期之类的东西,而
@Singleton
是最宽的。因此,如果
RemoteDataSourceComponent
取决于
WebserviceComponent
,这意味着
WebserviceComponent
可以活得更久。


3
投票

另一个解决方案(不定义额外的范围)是使用“常规”(未注释)接口分隔两个组件。

在你的情况下,说

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.