我有这个组成部分:

@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);

}

我得到这个错误:



如果我将LoggedUserComponent的inject方法参数更改为另一个Activity,请这样说AnotherActivity:
@Singleton
@Component(modules = LoggedUserModule.class)
public interface LoggedUserComponent {

    void inject(AnotherActivity a);

}

编译还可以。为什么?我不能有两个具有相同注入(inject)特征的组件吗?

我正在尝试了解Dagger的工作原理,因此将不胜感激。谢谢。

最佳答案

可以将dagger视为一个对象图,它实际上就是对象图。除了出于测试目的(或者如果要包括其他行为,而不是其他行为)之外,您可能不应该具有2个能够注入(inject)同一对象的不同组件。

如果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 都将能够提供在图中较高的依赖关系,从而也可以解决您的错误。

关于android - Dagger2 : Error when two components has same inject method signature,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35779851/

10-12 04:05