Presenter / View / ViewState关系

时间:2016-10-01 20:50:51

标签: android mvp mosby

例如,我的EditProjectFragment包含很少的元素:

  • TextView(项目名称)
  • ColorPicker(项目颜色)
  • Spinner(项目类型)

让我们看看:

  1. 项目名称将由TextView本身恢复
  2. 谁必须存储项目的颜色?
  3. 谁必须存储微调器的值?
  4. 似乎是ViewState的责任。例如,当用户选择颜色时,View会调用presenter.onProjectColorPicked(color)。然后,Presenter将调用view.setProjectColor(color)。或者View应该直接更新ViewState,如果不需要,可以不调用Presenter吗?

    另一个例子。用户在EditNoteFragment中添加照片。用户选择照片(presenter.pickPhoto()) - > presenter.addPhoto(photo)已致电并通知View将照片添加到ViewState并显示。 View应该自行更新Note对象吗?它应该由Presenter完成吗?在第一种情况下,它意味着ViewState将提供将由View使用的getNote()/setNote(note)方法。我应该通过View.setNote(note)方法更新Note-reference来复制它吗?第二种情况意味着我可能应该将Note对象存储在Presenter中,只更新View而不会在其中传递Note。但这看起来是错误的方式。

    换句话说: View必须在没有Presenter帮助的情况下做什么(向Note对象添加照片?)以及它有什么用处(按钮点击等)?

1 个答案:

答案 0 :(得分:2)

Viewstate旨在用于表示View中的不同状态。即视图显示加载指示器。所以我们可以说视图处于"加载状态"。所以无论什么时候#34;状态"更改通常涉及演示者,因为演示者负责协调视图状态。问题是:你如何定义国家?没有银弹。

我不认为玩像

这样的乒乓球比赛是有意义的
  1. presenter.onProjectColorPicked(color)
  2. view.setProjectColor(color)
  3. 除非你说它归结为这样的模型(业务逻辑):

    1. 查看来电presenter.onProjectColorPicked(color)
    2. 演示者调用model.setColor(color)
    3. 模型通知演示者(通过观察者模式)模型已更改
    4. 演示者调用包含新颜色的view.setData(newModelWithChangedColor)
    5. 一般情况下:视图只是显示(通过演示者)"模型的当前状态"是

      ViewState只是一个小帮手,以稍微方便的方式处理屏幕方向更改和处理死亡(与传统的onSaveInstanceState(Bundle)实现相比)。

      所以问问自己:你的"模型"的状态是什么。通常,视图的状态与"模型"的状态相同。

      在第一个例子中,似乎是颜色选择器和微调器的问题是不能在内部保存拾取的东西。因此,在onSaveInstanceState()中为picker / spinner手动执行此操作是android团队建议的默认方式。因此,如果您只是想使用ViewState功能不使用onSaveInstanceState(),因为您发现使用ViewState更方便,那么这也很好,尽管它不是ViewState的用途。