关于mvvm:MVI到底是不是凑数的通过案例与MVVM进行比较
前言最近看到不少介绍MVI架构,即Model-View-Intent的文章,有人留言说Google炒冷饭或者为了凑KPI“创造”了MVI这么一个词。和后端的敌人形容了一下,他们听了第一印象也是和MVVM如同区别不大。然而凭印象Google应该还没有到须要这样来凑数。 去看了一下官网,发现齐全没有提到MVI这个词。。然而举荐的架构图的确是更新了,用来演示MVI也的确很搭。 (官网图) 想了想,决定总结一下本人的发现,和掘友们一起探讨学习。 案例分享看过一些剖析MVI的文章,外面实现的办法各种各样,细节也不尽相同。甚至对于Model边界的划分也会不一样。 上面先分享一下在特定场景下我的MVVM和MVI实现(不重要的细节会省略)。 场景先预设一个场景,咱们的界面(View/Fragment)里有一个锅。次要工作就是实现一道菜的烹饪: flowchart LR停火 --> 热油 --> 加菜 --> 加调料 --> 出锅 几个须要留神的点: 初始状态:停火退出资料时:都是异步获取资料,再退出锅中完结状态:出锅本文次要是比拟MVVM和MVI,这里只分享这两种实现。 经典MVVM为了增强比照,这里的实现比拟靠近Android Architecture Components刚公布时官网的的代码架构和片段: (过后的官网图) // PotFragment.ktclass PotFragment { ... // 察看是否点火 viewModel.fireStatus.observe( viewLifecycleOwner, Observer { updateUi() if (fireOn) addOil() } ) // 察看油温 viewModel.oilTemp.observe( viewLifecycleOwner, Observer { updateUi() if (oilHot) addIngredients() } ) // 察看菜熟没熟 viewModel.ingredientsStatus.observe( viewLifecycleOwner, Observer { updateUi() if (ingredientsCooked) { // 加调料 addPowder(SALT) addPowder(SOY_SAUCE) } } ) // 察看油盐是否加完 viewModel.allPowderAdded.observe( viewLifecycleOwner, Observer { // 出锅! } ) viewModel.loading.observe( viewLifecycleOwner, Observer { if (loading) { // 颠勺 } else { // 放下锅 } } ) // 所有准备就绪,点火 turnOnFire() ...}// PotViewModel.ktclass PotViewModel(val repo: CookingRepository) { private val _fireStatus = MutableLiveData<FireStatus>() val fireStatus: LiveData<FireStatus> = _fireStatus private val _oilTemp = MutableLiveData<OilTemp>() val oilTemp: LiveData<OilTemp> = _oilTemp private val _ingredientsStatus = MutableLiveData<IngredientsStatus>() val ingredientsStatus: LiveData<IngredientsStatus> = _ingredientsStatus // 所有调料加好了才更新。这里Event外部会有flag提醒这个LiveData的更新是否被应用过 //(当年咱们还真用这种形式实现过单次生产的LiveData)。 private val _allPowderAdded = MutableLiveData<Event<Boolean>>() val allPowderAdded: LiveData<Event<Boolean>> = _allPowderAdded // 假如曾经实现逻辑从repo获取是否有还在进行的数据获取 private val _loading = MutableLiveData<Boolean>() val loading: LiveData<Boolean> = _loading fun turnOfFire() {} // 假如上面都是异步获取资料,这里简化一下代码 fun addOil() { repo.fetchOil() } fun addIngredients() { repo.fetchIngredients() } fun addPowder(val powderType: PowderType) { repo.fetchPowder(powderType) // 更新_allPowderAdded的逻辑会在这里 } ...}特点: ...