构造函数注入使匕首2和MVP中的MissingBinding

时间:2018-11-20 06:12:16

标签: dagger-2 android-mvp

我用dagger2和mvp创建了一个简单的项目。

这是我的组件:

@MainScope
@Component(modules = {MainModule.class})
public interface IMainComponent {
    void inject(MainActivity mainActivity);
}

这是MainModule.class:

@Module
public class MainModule {

    @MainScope
    @Provides
    IMain.IMainModel model() {
        return new MainModel();
    }
}

现在在演示者中,我想从其构造函数中插入演示者,所以我可以这样做:

public class MainPresenter implements IMain.IMainPresenter {
    IMain.IMainModel model;
    IMain.IMainView view;

    @Inject
    public MainPresenter(IMain.IMainModel model) {
        this.model = model;
    }  

但是我得到了这个错误:

  symbol:   class DaggerIMainComponent
  location: package com.safarayaneh.engineer.main.di
E:\Projects\Android\NewEng\Engineer\engineer\src\main\java\com\safarayaneh\engineer\main\di\IMainComponent.java:9: error: [Dagger/MissingBinding] com.safarayaneh.engineer.main.mvp.IMain.IMainPresenter cannot be provided without an @Provides-annotated method.

在MainModule.class中创建provider来创建演示者并删除presenter构造函数上方的@Inject时,一切都很好: @Module

public class MainModule {

    @MainScope
    @Provides
    IMain.IMainModel model() {
        return new MainModel();
    }


    @MainScope
    @Provides
    IMain.IMainPresenter presenter(IMain.IMainModel model) {
        return new MainPresenter(model);
    }
}

1 个答案:

答案 0 :(得分:3)

您的问题是您的活动期望IMain.IMainPresenter,但是如果您仅注释构造函数,则对象图上放置的是具体的MainPresenter

您在这里有三个选择:

  1. 使用显式提供程序方法(如您所做的那样)
  2. 在模块内部使用@Binds批注指定MainPresenter应以IMain.IMainPresenter的形式提供
  3. 请勿使用演示者界面