RicardoJiang / android-architecture

追求android架构更佳实践~
MIT License
323 stars 48 forks source link

关于MVIExt的一点疑问 #2

Closed iotxc closed 2 years ago

iotxc commented 2 years ago
observeState(this, T::a, T::b) { a, b->  }

这样写表示的应该是a和b数据的改变会触发同一个action吧?

如果这样写:

liveData {
     observeState(this, T::a) {   }
     observeState(this, T::b) {   }
}

跟直接observe没区别啊,代码还是不够简洁.

RicardoJiang commented 2 years ago
observeState(this,` T::a, T::b) { a, b->  }

是的这样表示,a和b数据的改变会触发同一个action

liveData {
     observeState(this, T::a) {   }
     observeState(this, T::b) {   }
}

而这样表示只监听一个属性,监听的代码是没有区别,区别在于在ViewModel中定义的LiveData少了

iotxc commented 2 years ago

我的想法是在data中增加一个字段用于区分UI应该更新哪部分数据

open class BaseViewSate {
    var state: Int = INIT_STATE
    companion object {
        const val INIT_STATE = 0
    }
}

每个业务数据对应一种状态

data class MainViewState(
    val fetchStatus: FetchStatus = FetchStatus.NotFetched,
    val newsList: List<NewsItem> = emptyList()
): BaseViewSate() {
    companion object {
        const val LIST= 1
    }
}

这样UI的模板代码可以相应的减少

viewModel.viewStates.observe(this) {
      when (it.state) {
          LIST -> {  }
      }
}

不过还是那句话,代码只是转移了,代码量并没有减少

RicardoJiang commented 2 years ago

我不懂,UI应该更新哪部分数据,相应部分的UI订阅相应的属性不就可以了吗,为啥搞个基类出来?并且ViewState里的变量应该都是val,而不应该是var类型的 可以看下Android架构指南,界面层订阅相应状态部分:https://developer.android.com/jetpack/guide/ui-layer?hl=zh-cn#show-operations