【问题标题】:android mvvm massive number of observersandroid mvvm 海量观察者
【发布时间】:2018-04-04 22:08:24
【问题描述】:

这是一个非常主观的问题。 我终于越来越习惯于 MVVM(模型视图视图模型)(或者至少我是这么认为的),现在发生的事情是我在 ViewModel 中添加越来越多的 MutableLiveData 对象,然后直接从 Activity onCreate 观察。 我不确定这是否有益,或者这是否是来自 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 上是预期的吗? 有没有一种方法可以使代码更干净?

提前致谢。

【问题讨论】:

    标签: android mvvm kotlin


    【解决方案1】:

    如果你使用 kotlin,那么使用密封类并使用一些状态来代替。

    例如:

    sealed class ScreenState {
        class Loading : ScreenState ()
        class Idle(var data: Any) : ScreenState ()
        class Dummy(val dummy: Any) : ScreenState ()
        ...
    }
    

    来自您的视图模型

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

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

    【讨论】:

    • 酷!看起来很有趣,去试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多