我正在开始使用Dagger 2,并尝试找出如何使@Inject
和@Provides
一起良好地工作。注入顶级类时,很容易使所有工作正常。像这样:
class TopLevelClass {
@Inject
SecondaryClass1 class1;
private final SecondaryClass2 class2;
@Inject
TopLevelClass(SecondaryClass2 class2) {
this.class2 = class2;
}
}
@Module
class MyModule {
@Provides
SecondaryClass2 provideSecondaryClass2() {
return new SecondaryClass2();
}
}
但是,当我也必须为顶级类创建一个@Provides
方法时,一切都会停止。像这样:
class TopLevelClass {
@Inject
SecondaryClass1 class1;
private final SecondaryClass2 class2;
TopLevelClass(SecondaryClass2 class2) {
this.class2 = class2;
}
}
@Module
class MyModule {
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2) {
return new TopLevelClass(class2);
}
@Provides
SecondaryClass2 provideSecondaryClass2() {
return new SecondaryClass2();
}
}
在此示例中,我发现SecondaryClass1从未注入,因此当我尝试访问它时会得到一个NPE。对于提供的顶级类,我应该采用其他方法吗?
P.S。我认为这无关紧要,但这是我正在使用的组件,以防万一:
@Component(modules = {MyModule.class})
interface MyComponent {
TopLevelClass getTopLevelClass();
}
谢谢!
答案 0 :(得分:0)
您有2个选择:
@Provides
注释的方法),该对象将可以立即使用,无需任何代码。这就是匕首闪耀的地方。@Provides
返回我不知道为什么您会偏爱第二种选择,或者为什么甚至在希望使用构造函数时甚至希望使用字段注入,但是,您发现,如果您选择字段,则不会注入字段手动构造对象。生成的Dagger代码均不会运行-您必须自己执行此操作。
想到的一种方法是请求组件,然后注入对象。
@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
TopLevelClass tlc = new TopLevelClass(class2);
component.inject(tlc);
return tlc;
}