这是一个非常主观的问题。 我终于习惯了MVVM(Model View Viewmodel)(或者至少我认为是这样),现在发生的事情是我在ViewModel中添加越来越多的MutableLiveData对象然后直接观察关于创造的活动。 我不确定这是否有益,或者来自MVVM的噪音,或者即使我采取了错误的方法,甚至是最糟糕的,可能会有太多的责任到我的班级。 这是我从onCreate调用的一个连接观察者的方法:
private fun observeViewModel() {
preferencesViewModel.selectedDay.observe(this, Observer { refreshMarkers() })
viewModel.startPosition.observe(this, Observer { startPositionChanged(it) })
viewModel.finishPosition.observe(this, Observer { finishPositionChanged(it) })
viewModel.isShowingProgress.observe(this, Observer { progressDialogStateChanged(it) })
viewModel.directionLine.observe(this, Observer { plotRoute(it) })
viewModel.weathers.observe(this, Observer { if (it != null) showWeathers(it) })
viewModel.isShowingTopBar.observe(this, Observer { if (it == true) showTopBar() else hideTopBar() })
viewModel.shouldFinish.observe(this, Observer { if (it == true) finish() })
viewModel.error.observe(this, Observer { if (it != null) showErrorDialog(it) })
viewModel.actionRequest.observe(this, Observer { if (it != null) showActionRequest(it) })
viewModel.permissionRequest.observe(this, Observer { if (it != null) requestPermissions(it) })
}
所以我的问题是,这是否适用于带有LiveData的MVVM? 有没有一种方法可以使代码更清晰?
提前致谢。
答案 0 :(得分:1)
如果你使用kotlin那么使用密封类和使用某些状态呢。
例如:
sealed class ScreenState {
class Loading : ScreenState ()
class Idle(var data: Any) : ScreenState ()
class Dummy(val dummy: Any) : ScreenState ()
...
}
来自您的viewmodel
private val liveData: MutableLiveData<ScreenState> = MutableLiveData()
...
liveData.value = Idle(Any())
...
liveData.value = Loading()
从您的视图/控制器
viewModel.liveData.observe(this, Observer {
it?.let {
when (it) {
is ScreenState.Start -> ...
is ScreenState.Idle -> ...
is ScreenState.Dummy -> ...
}
}
})
您甚至可以使用带密封类的通用
sealed class DataRequestState<T> {
class Start<T> : DataRequestState<T>()
class Success<T>(var data: T) : DataRequestState<T>()
class Error<T>(val error: Throwable) : DataRequestState<T>()
}
这可能有助于使事情更清晰可读!