3

例如,我有EditProjectFragment其中包含几个元素:

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

让我们来看看:

  1. 项目名称会由 TextView 自己恢复
  2. 谁必须存储项目的颜色?
  3. 谁必须存储微调器的值?

似乎是ViewState他的责任。例如,当用户选择颜色时,View调用presenter.onProjectColorPicked(color). 然后,Presenter将调用view.setProjectColor(color). 还是View应该ViewState直接更新,如果不需要就不用调用Presenter


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


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

4

1 回答 1

2

Viewstate 旨在用于表示来自您的 View 的不同状态。即视图显示加载指示器。所以我们可以说视图处于“加载状态”。因此,每当“状态”发生变化时,通常都会涉及到演示者,因为演示者有责任协调视图状态。问题是:你如何定义状态?没有银弹。

我认为玩这样的乒乓球比赛没有意义

  1. presenter.onProjectColorPicked(color)
  2. view.setProjectColor(color)

除非,你说它归结为这样的模型(业务逻辑):

  1. 查看通话presenter.onProjectColorPicked(color)
  2. 演示者通话model.setColor(color)
  3. 模型通知演示者(通过观察者模式)模型已更改
  4. view.setData(newModelWithChangedColor)包含新颜色的演示者调用

一般来说:视图只是显示(通过演示者)“模型”的当前状态是什么。

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

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

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

于 2016-10-01T21:59:07.223 回答