为了简化问题先决条件,假设设置了以下来源:
的src / 主要 / JAVA /二
ApplicationComponent.java:
@PerApplication
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(MyApplication target);
}
ApplicationModule.java
@Module
public class ApplicationModule {
@Provides @PerApplication
CoffeeMaker provideCoffeeMaker(CoffeeMakerImpl impl) { return impl; }
}
的src /的调试 / JAVA /二
DebugApplicationComponent.java:
@PerApplication
@Component(modules = {DebugApplicationModule.class})
public interface DebugApplicationComponent extends ApplicationComponent {}
DebugApplicationModule.java
@Module(includes = ApplicationModule.class)
public class DebugApplicationModule {
@Provides @PerApplication
Heater provideHeater(HeaterImpl impl) { return impl; }
}
的src / 主要 / JAVA /应用
CoffeeMakerImpl.java
class CoffeeMakerImpl implements CoffeeMaker {
@Inject CoffeeMakerImpl(Heater heater) {}
}
在MyApplication.java中
@Inject CoffeeMaker coffeeMaker;
DaggerDebugApplicationComponent.
builder().
applicationModule(new ApplicationModule(application)).
debugApplicationModule(new DebugApplicationModule()).
build().
inject(this);
编译项目时出错:
Error:(18, 10) error: Heater cannot be provided without an @Provides-annotated method.
app.Heater is injected at
app.CofeeMakerImpl.<init>(heater)
app.CofeeMakerImpl is injected at
app.MyApplication
app.MyApplication is injected at
di.ApplicationComponent.inject(target)
我希望,到期DebugApplicationModule
包含 ApplicationModule
,我传递给DebugApplicationComponent
这两个模块DebugApplicationComponent
都应该看到Heater
和CoffeeMaker
。
可能是什么原因,为什么Heater
无法在注射链中访问?
P.S。感谢@DavidMedenjak,解决方案很简单:只需使ApplicationComponent成为一个简单的界面,删除@PerApplication @Component(modules = {ApplicationModule.class})
行。
看到他的回答,那里有一些有用的建议。
答案 0 :(得分:1)
我希望,到期
DebugApplicationModule
包括ApplicationModule
[...]应该同时看到Heater
和CoffeeMaker
。
DebugApplicationModule
编译得很好,问题是你的 ApplicationComponent
无法编译,因为它不知道如何注入MyApplication
。
@PerApplication
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(MyApplication target);
}
在此声明此组件知道如何注入MyApplication
,但它无法访问或了解Heater
,正如您在编译错误中所看到的那样:
error:(18, 10) error: Heater cannot be provided without an @Provides-annotated method.
app.Heater is injected at
app.CofeeMakerImpl.<init>(heater)
app.CofeeMakerImpl is injected at
app.MyApplication
app.MyApplication is injected at <- trying to inject MyApplication
di.ApplicationComponent.inject(target) <- ApplicationComponent has the problem
确保始终密切关注编译错误。
您只需将此知识添加到DebugApplicationModule
,但ApplicationComponent
也表示可以注入该类,但不能。
要解决此问题,显而易见的解决方案是从inject()
移除ApplicationComponent
签名并将其移至DebugApplicationComponent
,因为它只是不知道如何注入它。注入Application
的完整信息位于DebugApplicationComponent
之内,之后也可能ReleaseApplicationComponent
。
由于您可能需要组件实现的界面,因此您也可以从@Component
中删除ApplicationComponent
注释。
public interface ApplicationComponent {
void inject(MyApplication target);
}
使其成为一个简单的界面,Dagger不会尝试生成实现。
您还可以查看组件构建器方法,您可以在其中将不同的对象/模块绑定/添加到组件。