53

我在理解为什么以下代码不起作用时遇到了问题。

我有以下项目结构:

@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

在哪里

@Module
public class CCModule {

    @Provides @Singleton
    public XXX provide XXX(){
        return new XXX();
    }
}

@Component(dependencies = CComponent.class, modules = AAModule.class) 
public interface AComponent {
    YYY getYYY();
}

在哪里

class YYY {
   @Inject
   public YYY(XXX xxx) {
       ...
   }
}

我将所有内容初始化为:

CComponent c_component = Dagger_CComponent.builder().cCModule(new CCModule()).build();

AComponent a_component = Dagger_AComponent.builder()
        .cComponent(c_component)
        .aAModule(new AAModule())
        .build();

一旦编译发生,我会收到以下错误:

错误:(11, 1) 错误: com.test.CComponent (unscoped) may not reference scoped bindings: @Provides @Singleton com.test.XXX com.test.CCModule.provideXXX()

我的目标是让一个组件从其他组件继承绑定以对对象(单例)具有相同的引用。

4

3 回答 3

115

你应该把@SingletonCComponent声明。

@Singleton
@Component(modules = CCModule.class) 
public interface CComponent {
    XXX getXXX();
}

解释在错误消息中:CComponent是无范围的,@Singleton是一个范围。Dagger 2 不允许无作用域的组件使用具有作用域绑定的模块。
但是,现在您将收到以下错误:

AComponent (unscoped) cannot depend on scoped components:
@Component(dependencies = CComponent.class, modules = AModule.class)

无作用域的组件不能具有作用域的依赖项。所以你需要做AComponent范围。为此,请创建自定义AScope注释。

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

并用它注释AComponent

@AScope
@Component(dependencies = CComponent.class, modules = AModule.class)
public interface AComponent {
}

这些是最新快照版本中出现的新要求。已在相应的issue中讨论过,可能仍会更改。

于 2015-01-29T04:12:56.637 回答
6

添加

@Singleton
@Component(modules = {NameModule.class})
public interface NameComponent {

}

对于组件,因为 dagger2 不允许将无作用域的组件与作用域模块一起使用

于 2017-11-09T06:27:10.733 回答
0

看起来像最新 Dagger-2 版本中的一个错误: https ://github.com/google/dagger/issues/107

于 2015-01-29T08:33:35.113 回答