Dagger2:两个组件具有相同的注入方法签名

时间:2016-03-03 18:13:52

标签: android dagger-2

我有这个组件:

@Singleton
@Component(modules = OauthModule.class)
public interface OauthComponent {

    void inject(LoginActivity a);

}

和模块:

@Module
public class OauthModule {

    @Provides
    @Singleton
    Oauth2Service provideOauth2Service() {
        return new Oauth2StaticService();
    }

}

和另一个组成部分:

@Singleton
@Component(modules = LoggedUserModule.class)
public interface LoggedUserComponent {

    void inject(LoginActivity a);

}

我收到此错误:

  

错误:(15,10)错误:如果没有,则无法提供Oauth2Service   @ Provide-或@ Produces-annotated方法。

如果我将LoggedUserComponent的inject方法参数更改为另一个Activity,请说AnotherActivity,如下所示:

@Singleton
@Component(modules = LoggedUserModule.class)
public interface LoggedUserComponent {

    void inject(AnotherActivity a);

}

编译没问题。为什么?我不能拥有两个具有相同注入签名的组件吗?

我正在努力了解Dagger如何运作,所以我们将不胜感激任何帮助。感谢。

2 个答案:

答案 0 :(得分:9)

dagger视为对象图 - 实际上是它。您可能有2个不同的组件能够注入相同的对象,除了用于测试目的(或者如果您想要包含不同的行为,而不是额外的行为)。

如果您的LoginActivity依赖于多个模块,则应将它们聚合在一个组件中,因为如您的错误所示,如果dagger无法提供单个所有依赖关系,则dagger将失败成分

@Singleton
@Component(modules = {LoggedUserModule.class, OauthModule.class})
public interface LoggedUserComponent {

    void inject(AnotherActivity a);

}

查看Oauth2Service,这很容易就是多个对象可以使用的东西,因此更高的范围就足够了。在这种情况下,您应该考虑将@Singleton范围添加到您的应用程序组件中,或者可以创建自己的组件,例如: @UserScope

然后,您必须使LoggedUserComponent成为@Subcomponent或使用@Component(dependencies = OauthComponent.class)将此组件声明为依赖项,并在OauthComponent中为其提供getter。在这两种情况下,dagger也能够提供图中较高的依赖关系,从而解决您的错误。

答案 1 :(得分:0)

它因为你说你可以注入该课程而生气,但是你没有提供它期望你提供的课程。您只需将OauthModule添加到LoggedUserComponent即可。试试这个

@Singleton
@Component(modules = {LoggedUserModule.class, OauthModule.class})
public interface LoggedUserComponent {

    void inject(LoginActivity loginActivity);

}