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