我遇到了 Dagger 依赖周期的问题,尽管寻找了几个小时,但我找不到解决方案。我想这就是我的建筑理念。可能出什么问题了?我使用的是 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) {
//..
}
}
最佳答案
你的问题是你试图用 Dagger 解决 ciclic 依赖,而 Dagger 并不能解决这个问题。
这可以在您的架构中得到纠正。只需将回调传递给您的模型,而不是将 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
关于java - Dagger + MVP - 在模型中注入(inject) Presenter 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322341/