java - Dagger 错误 : Can't inject a non-static inner class

标签 java android dependency-injection dagger mortar

我正在尝试使用 Dagger 在我的应用程序中实现依赖项注入(inject)。我的结构与 "Simpler Android apps with Flow and Mortar" 中描述的类似

我有一个 DayScreen 类:

@Layout(R.layout.day)
public class DayScreen extends DateScreen {
    LocalDate date;

    public DayScreen(LocalDate date) { this.date = date; }

    @Override public String getMortarScopeName() { return getClass.getName(); }
    @Override public Object getDaggerModule getModule() { retrun new Module(); }

@dagger.Module(addsTo = UiModule.class, injects = DayView.class, complete = false, library = true)
public class Module {
    @Inject RestService api;
    @Inject DateTimeFormatter formatter;

    @Provides @Named("DayScreenDate") LocalDate provideDate(){
        return date;
    }
}

@Singleton
public class Presenter extends ViewPresenter<DayView> {
    //@Inject RestService api;
    //@Inject DateTimeFormatter formatter;
    RestService api;
    DateTimeFormatter formatter;

    @Inject Presenter( RestService api, DateTimeFormatter formatter){
        this.api = api;
        this.formatter = formatter;
    }

    @Override
    protected void onLoad(Bundle savedInstanceState) {
        super.onLoad(savedInstanceState);
        api.statisticsDay(DayScreen.this.date.format(formatter))
                .observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        resp -> getView().setData(resp.events),
                        err -> Log.e(TAG, err.getLocalizedMessage()),
                        () -> Log.v(TAG, "day stats received")
                );
    }
}

这里 DateScreen 是一个抽象:

public abstract class DateScreen implements Blueprint {
  protected LocalDate date;

  public DateScreen() { this(LocalDate.now()); }
  public DateScreen(LocalDate date) { this.date = date; }

  public LocalDate getDate() { return date; }
  public void setDate(LocalDate date){ this.date = date; }
}

我试图通过构造函数和槽字段注入(inject)在 Module 和 Presenter 中注入(inject) apiformatter 但它咳嗽了同样的错误 error: Can't inject一个非静态内部类:...

有人知道为什么它需要静态类吗?是否有任何更改使我上面提到的文章变得无关紧要?

谢谢。

最佳答案

非静态类需要一个封闭的实例来实例化。这会阻止 DI 框架实例化它们。如果您有嵌套类,那么在任何情况下都将它们设为静态是个好主意。

如果您的嵌套类本质上依赖于封闭类实例,那么您必须重构以使这些类成为静态类,并定义一个采用封闭类实例的显式构造函数。

关于java - Dagger 错误 : Can't inject a non-static inner class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506715/

相关文章:

java - 将代码从 C# 转换为 Java - 位操作、Int64 到 long

java - 如何在 Hibernate 中识别自引用一对一关系的映射/拥有方?

java - 编写 JUnit 测试以检查 SharedPreferences 数据

android - 广播接收器是否必须作为单独的文件?

java - Spring Framework - 为游戏创建规则引擎的设计模式

c# 依赖注入(inject)无法将 lambda 转换为预期的委托(delegate)

java - JAXB 不序列化完整的对象图

java - 如何在 selenium 中运行代码以在 python 脚本而不是 cron 中的一天中的特定时间执行函数

android - 使用 Firebase 时出现 StackoverflowError

c# - Json.NET如何在反序列化过程中进行依赖注入(inject)?