赞
踩
MVI 是Model-View-Intent
的简称,它们分别表示。。。。。
我并不打算逐个字母介绍它们代表的意思。因为这样一点也不能增进对 MVI 的理解,反而会对它的认识蒙上厚厚的一层迷雾。
奥古斯都在《忏悔录》里面问我这样一个问题:“时间到底是什么?你不问我的时候,我是知道的;你一问我,我就不知道了。”
把“时间”换成“MVI”,这个问题同样困扰着我:“MVI 到底是什么?你不问我的时候,我是知道的;你一问我,我就不知道了。”
维特根斯坦会说,上面是一个非法的问题,源于错误地使用了语言。
正确的问题应该是这样问的:人们在什么场景下使用 MVI,他们是怎么使用 MVI 的?他们为什么会使用 MVI?
请原谅我,还是使用了这么拗口的一个名词作为本节的开始。
会试着从日常开发中熟悉的场景出发,一步步演绎出什么叫“唯一”,什么叫“可信”。
假设下面这个场景: “一个可以发帖的社区界面,未加入社区时发帖按钮是置灰不能点击的,当以版主身份进入社区时发帖按钮是红色,当被禁言后按钮变黑。”
最初我是这样实现的:
- class CommunityActivity : AppCompatActivity() {
- private val postBtn: Button
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- val userInfo = viewModel.getUserInfo() // 从服务器获取的用户身份状态信息
- postBtn.apply {...} // 初始化发帖按钮
- }
- override fun onEnter(identity: Identity) {
- postBtn.apply {...} // 加入社区后刷新发帖按钮(依赖 Identity)
- }
- override fun onExit() {
- postBtn.apply {...} // 退出社区后刷新发帖按钮
- }
- override fun onMute(mute: Mute) {
- postBtn.apply {...} // 禁言后刷新发帖按钮 (依赖 Mute)
- }
- }
- 复制代码
这样写对于功能实现来说没毛病,但维护起来会很头痛,因为一个控件的更新逻辑散落在 Activity 的各个地方,并且更新控件所依赖的数据是五花八门的,即未做到依赖单一数据源。界面简单还好,若复杂界面中有十几个这样的控件,Activity 的代码没法看。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。