单向数据流
用户界面是持续变化的,那是不是可以用数据流来理解界面持续的变化?
界面变化是数据流的末端,界面消费上游产生的数据,并随上游数据的变化进行刷新。
若用数据流来理解界面刷新,就必须抽象出两个“数据”。
第一个数据是从界面发出的事件(意图),即 MVI 中 I(Intent)。在 MVP 和 MVVM 中,界面发出的事件是通过一个 Presenter/ViewModel 的函数调用实现的,这是命令式的。为了实现响应式编程,需把这个函数调用转换成一个数据,即Intent
。
第二个数据是返回给界面的状态,即 MVI 中的 M(Model),它通常被称为状态State
,从字面就可以感觉到界面状态是会时刻发生变化的。
从界面发出的数据叫Intent
,而界面接收的数据叫State
,这样整个界面的刷新流程就形成一条Unidirectional Data Flow(UDF)
,即单向数据流:
当然还可以把数据流过网络,数据库的线路也画出来,这样就会形成更大的圆环,但数据流的方向还是单向的。
当然也可以把 ViewModel 换成 Presenter,单向数据流依然成立。图中 ViewModel 这个位置可以是任何其他东西,只要它满足下面三个要求:接收界面事件、存储界面状态、并以响应式编程的方式将事件转换为状态并推送给界面。
“单向数据流”是“唯一数据源”的必然结果,即触发界面刷新的只有唯一数据源。因为如果有多个数据源的话就会变成下面的状态:
此图就像 demo 中第一个版本的代码一样,更新视图状态的代码散落在 Activity 的各个地方,难以维护,容易出bug。