我正在处理的 android 项目的 Dagger 配置: 注意:我已经在需要的地方提供了所有需要的@Component、@Module、@Provides 注释。
MainActivity {
@Inject A a;
@Inject B b;
onCreate(){
ComponentX.inject(this);
ComponentY.inject(this);
}
}
ComponentX-> ModuleA ->providerA
ComponentY -> ModuleB -> providerB
如您所见,这是两个完全独立的组件,除了在注入(inject)点之外,彼此毫无关联。
在编译过程中出现以下错误:
In file A.java
error: B cannot be provided without an @Provides- or @Produces-annotated method.
MainActivity.b
[injected field of type: B b]
我是否错误地认为在使用 dagger 2 时可以使用多个组件,或者应用程序应该使用一个负责所有注入(inject)的大组件?
任何人都可以帮助我了解我哪里出错了吗?
最佳答案
您不必只有一个组件,有多种方法可以将它们模块化,但是您创建的每个对象或向其中注入(inject)值的每个对象都必须具有由单个组件提供的所有值。
重组代码的一种方法是让 ComponentY 依赖于 ComponentX,反之亦然,例如
@Component(dependencies = ComponentX.class)
interface ComponentY {
void inject(MainActivity activity);
}
或者如果 ComponentX 和 ComponentY 彼此完全正交,您可以创建第三个组件,比如 ComponentZ。
@Component(dependencies = {ComponentX.class, ComponentY.class})
interface ComponentZ {
void inject(MainActivity activity);
}
或者您可以重用模块,例如
@Component(modules = {ModuleA.class, ModuleB.class})
interface ComponentZ {
void inject(MainActivity activity);
}
您决定如何拆分它在很大程度上取决于您的代码结构。如果组件 X 和 Y 可见但模块不可见,则使用组件依赖项,因为它们(和模块依赖项)实际上是组件的实现细节。否则,如果模块可见,则简单地重用它们。
我不会为此使用作用域,因为它们实际上用于管理具有不同生命周期的对象,例如与特定用户关联的对象,其生命周期是从用户登录到注销的时间,或者特定请求的生命周期。如果它们确实具有不同的生命周期,那么您正在考虑使用作用域和子组件。
关于java - 多个独立组分注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341839/