android mvvm观众人数众多

时间:2018-04-04 22:08:25

标签: android mvvm kotlin

这是一个非常主观的问题。 我终于习惯了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? 有没有一种方法可以使代码更清晰?

提前致谢。

1 个答案:

答案 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>()
}

这可能有助于使事情更清晰可读!