Dagger 2:在构造函数中注入一个接口

Ime*_*ene 4 java android dependency-injection dagger dagger-2

我正在尝试学习匕首2,但我对使用接口注入构造函数感到困惑.这是我的下面的代码:

MainActivity.java

public class MainActivity extends AppCompatActivity implements MainView {

    // this keyword of request dependency . At compiling process, dagger will look at all of these annotations
    //to create the exact dependency

    @Inject MainPresenter mainPresenter ;
    TextView textView ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textview) ;
        DaggerPresenterComponent.create().inject(this);
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                mainPresenter.doThings(8555) ;
            }
        });

    }

    /**********************************/

    @Override
    public void invokeRandomViewMethod(String msg) {
        textView.setText(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

MainPresenter.java

public class MainPresenter {

    private MainView mainView ;

    @Inject
    public MainPresenter(MainView mainView) {
        this.mainView = mainView;
    }

    public void doThings(int value){
        Random random = new Random();
        int rand= random.nextInt(value) ;
        if(mainView != null){
            mainView.invokeRandomViewMethod("You random number is "+rand);
        }
    }

public interface MainView {
    void invokeRandomViewMethod(String msg) ;
}
}
Run Code Online (Sandbox Code Playgroud)

这是模块:

@Module
public class PresenterModule {

    @Provides
        // this is the method that will provide the dependancy
    MainPresenter provideMainPresenter(MainView mainView){
        return new MainPresenter(mainView);
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是组件

@Component (modules = PresenterModule.class)
public interface PresenterComponent {
    void inject(MainActivity activity) ;
}
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,它显示了这个错误:

错误:(15,10)错误:com.imennmn.hellodagger2example.MainView如果没有@ Provide-annotated方法,则无法提供.com.imennmn.hellodagger2example.MainView在com.imennmn.hellodagger2example.presenterInjection.PresenterModule.provideMainPresenter(MAINVIEW)com.imennmn.hellodagger2example.MainPresenter注入在com.imennmn.hellodagger2example.MainActivity.mainPresenter com.imennmn.hellodagger2example.MainActivity注入在com.imennmn.hellodagger2example.simpleInjection.DataComponent.inject(activity)中注入

我的问题是如何通过注入匕首并绑定MainPresenter和MainActivity来提供界面MainView?任何帮助,将不胜感激 !

azi*_*ian 7

通过以下代码:


    MainPresenter provideMainPresenter(MainView mainView) {
        return new MainPresenter(mainView);
    }

你在告诉匕首:"嘿,每当我要求你注射MainPresenter,用它来构造它MainView".但是匕首抱怨,因为你没有说明他应该如何建立/获得MainView.

所以,在你PresenterModule这样做:


    @Module
    public class PresenterModule {

        MainView mainView;

        public PresenterModule(MainView mainView) {
            this.mainView = mainView;
        }

        @Provides
        MainPresenter provideMainPresenter() {
            return new MainPresenter(mainView);
        }

    }

然后在构建组件时:


    DaggerPresenterComponent.builder()
                            .presenterModule(new PresenterModule(this))
                            .build();