首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在Transformations.map()在ViewModel中返回的Livedata上调用ViewModel()吗?

可以在Transformations.map()在ViewModel中返回的Livedata上调用ViewModel()吗?
EN

Stack Overflow用户
提问于 2019-02-15 11:22:38
回答 1查看 4.5K关注 0票数 3

我尝试使用LiveData Transformations.map()检查结果并更新UI。但是Transformations.map()回调不会在没有观察者的情况下触发。

那么,在由observeForever {}返回的实时数据上调用是一个很好的方法吗?并在onCleared上删除ViewModel?上的工具。

代码语言:javascript
复制
private lateinit var map: LiveData<Unit>

    fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
        progressDialogVisibleLiveData.postValue(true)

        val appConfigurationLiveData = MutableLiveData<TopRatedMoviesResponse>()

        val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())

        map = Transformations.map(appConfigurationSourceLiveData) { dataResult ->
            progressDialogVisibleLiveData.postValue(false)

            when (dataResult) {
                is DataResultSuccess -> {
                    appConfigurationLiveData.postValue(dataResult.data as TopRatedMoviesResponse)
                }

                is DataResultFailed -> {
                    when (dataResult.errorCode) {
                        HTTPError.NO_INTERNET -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }

                        HTTPError.BAD_REQUEST -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }

                        HTTPError.UNAUTHORISED -> {
                            unAuthorisedEventLiveData.postValue(true)
                        }

                        HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }
                    }
                }
            }
        }
        map.observeForever {  }

        return appConfigurationLiveData
    }

    override fun onCleared() {
        super.onCleared()

        map.removeObserver {  }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-15 14:21:07

但是Transformations.map回调不会在没有观察者的情况下触发。

这是正常的,没有对observerForever()的调用,Transformations.map()返回的LiveData没有任何人提供它保存的数据。

那么,在由observeForever返回的livedata上调用observeForever {}是一种好方法吗?

看一下您在该方法中所做的事情,答案是否定的,这不是使用Transformations.map()的方式。该方法的目标是对源LiveData发出的值进行一些更改,然后将这些值呈现给观察者。在您的示例中,您希望进行简单的类型更改(从dataResult.data到TopRatedMoviesResponse),并在出错时触发一些错误LiveDatas。检查下面的代码:

代码语言:javascript
复制
fun getAppConfiguration(): MutableLiveData<TopRatedMoviesResponse> {
    progressDialogVisibleLiveData.postValue(true)
    val appConfigurationSourceLiveData : MutableLiveData<DataResult> = splashScreenRepository.getAppConfiguration(getApplication())
    return Transformations.map(appConfigurationSourceLiveData) { dataResult ->
            progressDialogVisibleLiveData.postValue(false)
            when (dataResult) {
                is DataResultSuccess -> {
                    dataResult.data as TopRatedMoviesResponse
                }
                is DataResultFailed -> {
                    when (dataResult.errorCode) {                        
                        HTTPError.UNAUTHORISED -> {
                            unAuthorisedEventLiveData.postValue(true)
                        }
                        HTTPError.FORBIDDEN, HTTPError.NOT_FOUND, HTTPError.INTERNAL_SERVER_ERROR, HTTPError.UNKNOWN, HTTPError.NO_INTERNET, HTTPError.BAD_REQUEST -> {
                            errorDialogVisibleLiveData.postValue(dataResult)
                        }
                    }
                    // we have to return something even if an error occured
                    // I'm returning null, your UI should handle this
                    null 
                }                   
            }
     }
}

还可以查看建筑指南,了解使用LiveData处理数据和错误的其他方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54708268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档