【问题标题】:Dagger error: Can't inject a non-static inner classDagger 错误:无法注入非静态内部类
【发布时间】:2014-12-16 14:17:56
【问题描述】:

我正在尝试使用 dagger 在我的应用程序中实现依赖注入。我的结构与"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; }
}

我尝试通过构造函数和槽场注入在 Module 和 Presenter 中注入 apiformatter,但它咳出同样的错误 error: Can't inject a non-static inner class:...

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

谢谢。

【问题讨论】:

    标签: java android dependency-injection dagger mortar


    【解决方案1】:

    非静态类需要实例化一个封闭实例。这阻止了 DI 框架实例化它们。如果您有嵌套类,那么无论如何将它们设为静态都是一个好主意。

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

    【讨论】:

    • 对不起,我忘了说这是编译时错误,它们无法在编译时实例化。请参阅我在问题中提到的文章中的AlbumScreen class。有内部非静态类ModulePresenter
    • 没有类在编译时被实例化。我不关注你。
    • 您写了“非静态类需要实例化一个封闭实例。”但是在编译时发生错误,它怎么可能需要实例。
    • 它无法生成注入代码,因为该代码需要封闭实例。
    • 啊,这是一个特殊的构建时间步骤?但无论如何,这对于解决方案的方法并没有太大变化。
    猜你喜欢
    • 1970-01-01
    • 2013-10-29
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多