我遇到了一个非常不寻常的问题,即LiveDataScope没有抛出我的异常,在我的存储库中启动。 问题是,如果我放置了一个 livedata 事件来代替 emit,它会被调度给观察者,但是使用 emit,它不会向它启动事件。
视图模型:
fun launchJob(makeThis: suspend LiveDataScope<ViewState>.() -> Unit): LiveData<ViewState> =
liveData {
viewModelScope.launch {
emitLoad()
try {
makeThis(this@liveData)
} catch (error: Error){
//its work
showErrorEvent.value = Pair(error, true)
// not work
emit(ViewState.Error(error))
}
}
}
viewmodel implementation
/**
* Método responsável por realizar o método de reset de senha.
* */
fun requestReset() = launchJob {
emitSucess(shippingMethodRepository.resetPassword(method))
}
基本存储库
suspend fun getAsyncData(params: P): T {
try {
return api.invoke(params)
} catch (error: Exception) {
error.printStackTrace()
throw error
}
}
正如我所提到的,将发出更改为不同的实时数据,它由活动观察,并且发出之前的任何代码也会被读取,以及 Log 等。
来自文档:
liveData 构建块用作结构化并发 协程和实时数据之间的基元。代码块启动当 LiveData 变为活动状态并自动取消时执行 在可配置的超时后,当实时数据变为非活动状态时。
您的观察器在调用 emit 函数后未触发的根本原因是您的 liveData 已被观察(激活(。
LiveData 构建基块更适合初始化 liveData 值,而不是更改其值。如果你想像这样更改 liveData 值,只需使用 mutableLiveData