Dagger2:当两个组件具有相同的注入方法签名时出现错误

11

我有这个组件:

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

}

我遇到了这个错误:

Error:(15, 10) error: Oauth2Service不能没有@Provides-或@Produces-注释的方法提供。

如果我将LoggedUserComponent的inject方法参数更改为另一个Activity,比如像这样的AnotherActivity:

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

    void inject(AnotherActivity a);

}

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

我正在努力理解 Dagger 的工作原理,非常感谢您的帮助。

2个回答

10

dagger看作一个对象图,因为它实际上就是一个对象图。除了用于测试目的(或者想要包含不同行为而不是额外行为),您可能不应该有两个不同的组件能够注入相同的对象。

如果您的LoginActivity依赖于多个模块,您应该将它们聚合在一个单独的组件中,因为正如您的错误所显示的那样,如果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,并在OauthComponent中提供一个getter。在这两种情况下,dagger也能够提供在图形上找到的依赖项,从而解决您的错误。

0

由于你声称可以将注入的类注入到它,但是你没有提供它期望的类,所以它变得疯狂了。你只需要在你的LoggedUserComponent中添加OauthModule即可。试一试这个方法:

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

    void inject(LoginActivity loginActivity);

}

如果我的OAuthModule是单例的,那我就永远无法进行注入吗? - silentsudo
我不确定我理解你在问什么。 - ootinii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接