尝试新的架构范式,其中演示者创建不可变状态(模型)流并查看只是呈现它。
无法理解如何处理我们只需要一次性制作一些事件的情况。有几个例子。
1)笔记应用程序。我们有editText
和saveButton
。用户点击saveButton
,一些处理发生,editText 应该被清除。你们能描述一下我们ViewState
这里的内容和大致的逻辑流程吗?
我现在看到的问题和陷阱:
- 在presenter订阅
editText.textChanges()
。如果我们text
在ViewState
每次渲染调用中都有并渲染它,那么我们将陷入递归,因为它将发出新的 textChange 并更新状态并再次渲染。 - 我们是否需要
text
在ViewState
方向文本或进程终止/恢复上恢复它,看起来它在这里开箱即用。但是想象一下recyclerView
滚动位置。我们绝对需要保存它才能恢复。我们无法在每次渲染调用时恢复它,因为它看起来很奇怪,不是吗? - 如果我们将这样的逻辑视为副作用并称
.doOnNext{ view.clearText() }
其是有道理的,但我们是否参考了规范 MVI 实现中的视图?正如我所见,莫斯比没有它。 - 这是有道理的,但是在
doOnNext
呼叫的那一刻,视图可能会死掉。MVI 应该帮助我们解决这个问题,但前提是它是 的一部分ViewState
,对吧?
2) Github 应用程序。第一个屏幕(组织):orgEditText
, okButton
, progressBar
. 第二个屏幕(回购)recyclerView
:。当用户进入组织orgEditText
并单击okButton
应用程序时,应向 API 发出请求,并在成功时导航到 Repos 屏幕,或在失败时显示 toast。您能否再次描述ViewState
一下 Org 屏幕以及应该是什么样的逻辑?
我现在看到的问题和陷阱:
- 我们应该在加载时显示
progressBar
和禁用。okButton
我们应该喜欢加载/内容/错误密封类(让我们调用它ContentState
)并将其实例放在我们的ViewState
. View 知道如何渲染ContentState.loading
、显示progressBar
和禁用okButton
. 我对吗? - 那么如何处理导航呢?与 1.3 和 1.4 相同的问题。
- 我已经看到导航应该被视为副作用的意见,但同样是 1.4。
- 吐司 - 状态是否存在或者我们认为这是副作用?同样的问题。
谷歌提出SingleLiveEvent
了解决方案,但它看起来很奇怪,然后应该有尽可能多的LiveData<SingleLiveEvent>
流,而不是真正的单一事实来源。其他人建议从渲染函数生成的新意图更好,但有可能一些异步操作会再次改变状态,我们将在第一个显示时获得第二个 Toast,依此类推。