尝试新的架构范式,其中演示者创建不可变状态(模型)流并查看只是呈现它。
无法理解如何处理我们只需要一次性制作一些事件的情况。有几个例子。
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,依此类推。