没有'

时间:2017-06-10 08:25:36

标签: java android dagger-2

为了简化问题先决条件,假设设置了以下来源:

的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都应该看到HeaterCoffeeMaker

可能是什么原因,为什么Heater无法在注射链中访问?

P.S。感谢@DavidMedenjak,解决方案很简单:只需使ApplicationComponent成为一个简单的界面,删除@PerApplication @Component(modules = {ApplicationModule.class})行。

看到他的回答,那里有一些有用的建议。

1 个答案:

答案 0 :(得分:1)

  

我希望,到期DebugApplicationModule 包括 ApplicationModule [...]应该同时看到HeaterCoffeeMaker

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不会尝试生成实现。

您还可以查看组件构建器方法,您可以在其中将不同的对象/模块绑定/添加到组件。