旦用难回 Jetpack MVI 最佳实践

2022-07-05 10:50:02 +08:00
 KunMinX

如您已是 UnPeek-LiveData 资深玩家,今天这框架请不要错过 ——

刚于 Github 发行《 MVI 最佳实践》& 唯一可信源成熟态 “MVI-Dispatcher”,通过它可一举消除 “mutable 样板代码 + LiveData 连发事件覆盖 + LiveData.setValue 误用滥用” 等高频痛点问题,

欢迎 star 、test 、feedback 三连~

https://github.com/KunMinX/Jetpack-MVI-Best-Practice

10208 次点击
所在节点    Android
15 条回复
fromzero
2022-07-05 11:00:49 +08:00
又来发明新名词了,前端用烂的单向数据流。不说了,赶紧出付费教程,我第一个当韭菜
fromzero
2022-07-05 11:03:09 +08:00
想学习 mvi 的同学大可直接去看 aribnb 的 https://github.com/airbnb/mavericks ,基于 jetpack flow ,里面的代码质量细细研读会有很多收获
KunMinX
2022-07-05 11:18:06 +08:00
根据你的阴阳怪气,很难让人不无语。就踩吧,黑吧,毁灭吧 ~
xwdz9989
2022-07-05 14:51:35 +08:00
营销鬼才
yaocai321
2022-07-06 10:46:50 +08:00
每次来 Android 节点发推广没人鸟你,心里没点数?
矫揉造作,直接去当 stormzhang 门徒得了,也好早日财务自由~
cenbiq
2022-07-06 11:01:04 +08:00
@fromzero 一直想找一个这样的库,感谢老铁
XXWHCA
2022-07-07 09:40:22 +08:00
@fromzero 明白这就看一楼推荐的库了解一下
KunMinX
2022-07-07 11:03:00 +08:00
演的还挺像。1 、2 、3 、4 、5 ,人差不多也齐了,来个大家整个 “三人成虎”。
fromzero
2022-07-09 23:24:49 +08:00
@KunMinX 今天闲来无事,先来分析你的代码吧。 首先,mvi 的关键核心是状态机,不可变的状态,以及单向的数据流向,这也是现代声明式 ui 的思想,故 mvi 和 compose flutter 以及 swift ui 是十分契合的。大神的最佳实践中的 Event 应该就是 state 了,页面通过 out 订阅 state 的变化更新 ui ,这个没问题,但是不可变呢?你为什么直接更改 event 里的值啊?你这里也没有 reducer 的体现啊?![image.png]( https://s2.loli.net/2022/07/09/yWzxPYiQrdgXkK3.png) 另外 side effect 的情况本最佳实践怎么处理呢?
fromzero
2022-07-10 20:02:01 +08:00
@fromzero 不可变这里我看错了一丢丢,爱坤大神这里的 event 应该是代表每个 intent 产生的事件,但是数据什么的都包在 event 里面,然后再把 event 的数据赋值给 state 刷新,这里 state 的赋值也违法了不可变,那这里也很奇怪,我干嘛不直接拿 event 的数据刷新呢,out 监听的为什么是 event 不是 state ,那不是变成了 事件驱动 ui 而不是状态驱动 ui ? ![image.png]( https://s2.loli.net/2022/07/10/S4bTNOGp5FmDi1v.png)
fromzero
2022-07-10 20:43:08 +08:00
总结(仅仅是本菜鸡的个人观点):
整体架构看起来没啥问题,用户触发事件,请求数据,ui 监听事件改状态刷新 ui ,完美的单向数据流👍🏻。but
* 违反不可变,比如我在监听处偷偷修改 event 里面的值,直接破坏其他监听者的逻辑
* 没有状态机,只有一个 Event 事件队列机来发事件,通过监听 event 的数据,然后扔给给状态,而且状态这个变量 mStates 是由 ui 自己维护的(我自己维护我自己的状态?不应该是监听状态吗?)
fromzero
2022-07-10 21:02:11 +08:00
@KunMinX 说实话分析完我是吓一跳的,我原本还是挺认可你的技术的,虽说喜欢造新名词,但是之前的技术文章多少有几篇还不错的,我今天去看了一下你的重学 android 已经涨到¥ 379 了,静下心多打磨点干货吧。
GetCore
2022-08-14 01:01:07 +08:00
KunMinX
2022-08-30 16:01:31 +08:00
统一回复:

MVI 是实现单向数据流的一种方式,本质上是一种 IO 闭环,也即只要遵循函数式编程特性:唯一入口 + 唯一出口 + 无副作用,就可视作是 MVI 。

reduce 仅仅只是权宜之计,或者说主流解决方案,目的是在当下计算设备性能有限情况下,对状态集做的统一优化。实现 MVI 方式千千万,我个人认为 reduce 不能算是 MVI 本质。

至于 sample 案例中为什么没有为 “Intent” 字段添加 final ,那是因为 Java 下想要实现 Koltin val 同等效果,样板代码瞬间会飙出许多。val 是为了消除 数据一致性问题,而 java final 滋生的样板代码反而在日后容易滋生更多 “一致性问题”,

这几天腾出手开始解决这个问题,刚刚提交了可用于 Java 8 的 sealed class ,专门优化这问题。

最后,任何技术都存在演变的过程,没有什么一出生就是完美无缺,我希望一切都能实事求是交流,而不是高高在上的姿态嘲讽打击。

和所有我开源过的项目一样,MVI-Dispatcher 也是一个长期项目,我们希望打磨一个极低学习成本,在多数场景下都能稳定运作的框架。
KunMinX
2022-09-03 17:45:05 +08:00
也不能说是优化,应该说是一种细化和规范,提醒人们 newState 务必基于 oldState copy 而来,如果不是特别必要,比如如果业务细化程度不足以裂变出 partialChange ,那么在 MVP (最小可交付产品)设计中可以没有 reducer 。

目前觉得有必要引入 reducer 的场景在于事故高发地段,需要捕捉 state 变化的路径,乃至手动配置个 reducer 来管理 states 列表。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/864130

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX