我尝试发布一个状态为"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的状态🙈
1条答案
按热度按时间bvhaajcl1#
如果你想让事情有序地发生,不要使用
postValue
。“Post”意味着“尽快做这件事”,它会在协程还在运行的时候导致值在以后的某个时间被改变。它必然会在你的协程放弃主线程之后的某个时间发生。使用
value =
代替。这很好,因为viewModelScope
位于Dispatchers.Main上。