kotlin MutableLiveData未发布值

67up9zun  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(154)

我尝试发布一个状态为"Loading",以便在从服务器下载数据时向用户显示进度条,它看起来像这样:

private fun loadBottomSheetItems(currentViewState: BusinessMapViewState.Display, getBusinessByIdsRequest: GetBusinessByIdsRequest) {
 
    viewModelScope.launch {
        _businessMapViewState.postValue(
            currentViewState.copy(
                bottomSheetState = BottomSheetViewState.Loading <--------------- Always that state!
            )
        )
 
        val responseFlow = businessRepository.getBusinessListByIds(
            getBusinessByIdsRequest
        )
 
        responseFlow.collect { result ->
            if (result.isSuccess()) {
                val businesses = result.asSuccess().value.businessList
 
                _businessMapViewState.postValue(
                    currentViewState.copy(
                        bottomSheetState = BottomSheetViewState.Display(
                            items = businesses.map { business ->
                                BusinessListCardItemModel(
                                    businessId = business.id,
                                    businessName = business.name
                                )
                            }
                        )
                    )
                )
            } else {
                _businessMapViewState.postValue(
                    currentViewState.copy(
                        bottomSheetState = BottomSheetViewState.Error
                    )
                )
            }
        }
    }
}

但是,当我发布"Loading"状态时,该状态在数据加载后不会更改。
如果我删除"Loading"状态的postValue块,或者添加延迟,数据会正确显示,但是我需要一个进度条。
我还尝试将"Loading"状态的postValue块移出viewModelScope,但没有任何变化

    • 更新**

我解决了这个问题,代码的另一部分是更改ui的状态🙈

bvhaajcl

bvhaajcl1#

如果你想让事情有序地发生,不要使用postValue。“Post”意味着“尽快做这件事”,它会在协程还在运行的时候导致值在以后的某个时间被改变。它必然会在你的协程放弃主线程之后的某个时间发生。
使用value =代替。这很好,因为viewModelScope位于Dispatchers.Main上。

相关问题