java - Dagger + MVP - 在模型中注入(inject) Presenter 时出现问题

标签 java android dagger-2

我遇到了 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/

相关文章:

android - 从 Firebase 数据库中删除特定值

java - 从套接字的输入流中读取而无需在 JAVA 中忙等待

java - JUnit 测试失败 - 提示缺少刚刚插入的数据

java - 带有 JCombobox 编辑器的 JTable : handle mouse clicks

android - 在构建 Android 项目时添加 dexdebug 错误

android - 如何在 android 中通过手势平滑滑动?

java - TestNG 和 Selenium : Perform CRUD operations on entities with depedencies

android - 使用 Dagger 时 2 : e: [kapt] An exception occurred: java. lang.IllegalArgumentException: void

android - LiveData 观察永远不工作

android - Dagger2 和 Kotlin 运行失败,原因是 :app:compileDebugKotlinAfterJava