【问题标题】:MVP and non user interactionMVP 和非用户交互
【发布时间】:2017-03-23 15:57:40
【问题描述】:

我有一个使用 MVP 模式设计的应用。但有时我不确定我们所有的实现是否都遵循 MVP 最佳实践。虽然并不总是可以按照本书来工作,但我试图找出处理非用户交互的逻辑应该在哪里。

例如:

我必须检测垂直滚动 RecyclerView 的偏移量。当滚动达到内容高度的 20%(大约)时,我应该显示一个弹出窗口。现在,我的逻辑是(伪代码)

1. Presenter sets View.setVerticalOffsetTriggeringLimit(1000 pixels)
2. View triggers view event and call Presenter.offsetForPopUpReached()
3. Presenter triggers View.showPopUp()
4. pop up is shown

优点和缺点?有没有办法在仍然有可测试代码的同时做得更好?系统本身是不是应该使用presenter作为中间层的“用户”?

【问题讨论】:

    标签: android architecture mvp


    【解决方案1】:

    所有 UI 逻辑都属于 View。 Presenter 必须只有 Model 和 View 之间的交互逻辑。关键是,View 可能会有所不同——它可以是 UI,也可以是某些模块,通过套接字发送命令。关键是,在这两种情况下,“演示逻辑”——因为视图与数据交互保持不变,因此必须移动到演示器中。 Popups 、 margins 等,是一个 View 实现细节。 方便的实践——将 Presenter 创建为单例,并通过 DI 将其注入到 Activity 中,Activity 进而实现 View 并将其连接到该 View。 您可以通过 EventBus(粘性事件)从 Presenter 发送事件来摆脱 Model。如果您这样做,事件将一直等到 Activity 收到它(处理 Activity 生命周期)。我不久前遇到过这种方法。

    【讨论】:

    • 好吧,我可以争论。让 Presenter 在按下按钮后更新视图与滚动 1000 像素并触发事件没有什么不同。无论如何,模型都与视图分离。这完全是为了测试用例,并且拥有一个不一定是人类但 UI 的一部分的 Actor 应该被平等对待。这种事件不仅仅是 UI 的东西,而是一个可能(或可能不)也与模型交互的整个事件链。
    • 是的,我想,你就在这里。尝试在此处使用“调解器” - 接口,抽象滚动事件及其与 RecyclerView 的实现,它被传递到 View。可以替换为mock进行测试。
    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 2018-01-17
    • 2016-06-15
    • 1970-01-01
    • 2016-10-02
    • 2015-01-04
    • 2013-04-16
    • 2014-04-02
    相关资源
    最近更新 更多