如何使用Dagger2将Presenter注入视图(MVP模式)

时间:2015-08-11 22:47:12

标签: android mvp dagger-2

我想使用MVP模式构建Android应用程序。

我有一个片段(视图)和一个演示者类。

我想要的是基本上将演示者注入片段,并将片段设置为演示者的视图(通过视图将实现的接口)

如何使用依赖注入(使用Dagger2)轻松​​正确地连接2?

修改

此外,我希望演示者成为单身人士,因此它能够持久保存数据和状态改变方向

2 个答案:

答案 0 :(得分:2)

首先,您需要定义一个演示者模块:

@Module
class SearchPresenterModule {
    @NonNull
    private final SearchContract.View mView;

    SearchPresenterModule(@NonNull SearchContract.View view) {
        this.mView = view;
    }

    @Provides
    SearchContract.View provideSearchContractView() {
        return mView;
    }
}

以下是示例组件:

@FragmentScoped
@Component(modules = SearchPresenterModule.class)
interface SearchComponent {
    void inject(SearchActivity activity);
}

注入你的演示者:

@Inject
SearchPresenter mSearchPresenter;

DaggerSearchComponent.builder()
            .searchPresenterModule(new SearchPresenterModule(searchFragment))
            .build()
            .inject(this);

最后注入你的演示者的构造函数:

 @Inject
 SearchPresenter(@NonNull SearchContract.View view, @NonNull SearchRepository searchRepository) {
        this.mView = view;

        mView.setPresenter(this);
    }

额外:这里有碎片注释:

@Documented
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface FragmentScoped {

}

您可以查看我的MVP + DAGGER2示例回购 https://github.com/savepopulation/wikilight

答案 1 :(得分:0)

所以演示者就像

@Singleton
public class Presenter{
private View mView; ...

视图应为

public class View extends ...{
    @Inject
    protected Presenter mPresenter ...

嗯,你只需要模块中的方法,如

inject(View view)

和Dagger应该像单身实例和注射一样照顾其余部分