【发布时间】:2020-08-13 12:13:22
【问题描述】:
我正在尝试使用一个函数来执行所有 API 调用和 Room 存储。但是在这个函数中,我有一个emit 不起作用。
fun getAPI() = flow {
emit(State.Loading())
// suspend function
val response = safeApiCall{
// retrofit request here
}
when (response) {
is Success -> {
// Emit here not working
response.data?.let { emit(State.InsertOK(it)) }
// Insert data in Room
response.data?.let { insertQuery(it) }
}
is Error -> {
emit(State.Error(response.error)
}
}
emitAll(getQuery().map { State.Success(it) })
}
这些值收集在我的 ViewModel 中
private val _result = MutableLiveData<State<APIResult>>()
val result: LiveData<State<APIResult>>
get() = _result
fun getAPI( ) = viewModelScope.launch {
repository.getAPI()
.collect {
_result .postValue(it)
}
}
我尝试在emit 之后和之前调用 DAO,但没有任何变化。
我是否对 Flow 做错了不打算像这样使用的事情?
【问题讨论】:
-
好的。你能确认一件事,safeApiCall 不是异步调用或 myFlow() 函数内的另一个线程。
-
它是一个挂起函数
-
你能把收集方的代码粘贴过来吗?
-
感谢您的更新!我怀疑 myFlow() 是 repository.getAPI()?
-
是的!我会改正的