Dagger + MVP - 在模型中注入Presenter的问题

时间:2017-09-20 12:37:58

标签: java android dagger-2

我遇到了匕首依赖性循环的问题,尽管找了几个小时,我找不到解决方案。我认为这是我对建筑的看法。可能有什么不对?我使用的是Dagger 2.11。

遵循守则

Inicio.java

public class Inicio extends BaseFragment implements InicioMvpView {

@Inject
InicioMvpPresenter inicioPresenter;

@Inject
MainMvpPresenter<MainMvpView> mainPresenter;
//...

InicioComponent.java

@Subcomponent(modules = {InicioModule.class})
public interface InicioComponent extends AndroidInjector<Inicio> {

    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<Inicio> {
    }
}

InicioModel.java

public class InicioModel implements InicioMvpModel{

    @Inject
    InicioMvpPresenter inicioPresenter;

    @Inject
    public InicioModel() {

    }

    @Override
    public void recuperarAgendamentos() {

        //...

        inicioPresenter.atualizarListaAgendamentos(agendamentos);

    }
}

InicioModule.java

@Module
public class InicioModule {

    @Provides
    InicioMvpView provideInicioView(Inicio inicioFragment){
        return inicioFragment;
    }

    @Provides
    InicioMvpPresenter provideInicioPresenter(
            InicioPresenter presenter) {
        return presenter;
    }

    @Provides
    InicioMvpModel provideInicioModel(InicioModel inicioModel) {
        return inicioModel;
    }
}

InicioPresenter.java

public class InicioPresenter implements InicioMvpPresenter{

    @Inject
    InicioMvpModel inicioModel;

    @Inject
    InicioMvpView inicioMvpView;

    @Inject
    public InicioPresenter() {
    }

    @Override
    public void recuperarAgendamentos(Bundle savedInstanceState) {

    //..

    }
}

1 个答案:

答案 0 :(得分:2)

你的问题是你试图解决与Dagger和Dagger的ciclic依赖关系并没有解决这个问题。

这可以在您的架构中得到纠正。只需将回调传递给模型,而不是将Presenter传递给模型。

这个:

public class InicioModel implements InicioMvpModel{

@Inject
public InicioModel() {

}

@Override
public void recuperarAgendamentos(Presenter inicioPresenter) {

    //...

      inicioPresenter.atualizarListaAgendamentos(agendamentos);

    }
}

就是这样。只需将演示者作为模型中方法的参数传递即可。这使得通信更少耦合。

您还可以查看RxJava,它不需要在方法中传递演示者。链接:https://github.com/ReactiveX/RxJava

Antonio Leiva对MVP也有很好的实施方案: https://github.com/antoniolg/androidmvp