我正在尝试新的协程流程,我的目标是制作一个简单的存储库,可以从 web api 获取数据并将其保存到数据库,也可以从数据库返回一个流程。
我使用 room 和 firebase 作为 web api,现在一切看起来都很简单,直到我尝试将来自 api 的错误传递给 ui。
由于我从仅包含数据且不包含状态的数据库中获得了一个流,因此通过将其与 Web api 结果相结合来为其赋予状态(如加载、内容、错误)的正确方法是什么?
我写的一些代码:
道:
@Query("SELECT * FROM users")
fun getUsers(): Flow<List<UserPojo>>
存储库:
val users: Flow<List<UserPojo>> = userDao.getUsers()
Api 调用:
override fun downloadUsers(filters: UserListFilters, onResult: (result: FailableWrapper<MutableList<UserApiPojo>>) -> Unit) {
val data = Gson().toJson(filters)
functions.getHttpsCallable("users").call(data).addOnSuccessListener {
try {
val type = object : TypeToken<List<UserApiPojo>>() {}.type
val users = Gson().fromJson<List<UserApiPojo>>(it.data.toString(), type)
onResult.invoke(FailableWrapper(users.toMutableList(), null))
} catch (e: java.lang.Exception) {
onResult.invoke(FailableWrapper(null, "Error parsing data"))
}
}.addOnFailureListener {
onResult(FailableWrapper(null, it.localizedMessage))
}
}
我希望问题足够清楚感谢您的帮助
编辑:由于问题不清楚,我会尽力澄清。我的问题是房间发出的默认流只有数据,所以如果我要订阅流,我只会收到数据(例如,在这种情况下,我只会收到用户列表)。我需要实现的是某种通知应用程序状态的方法,例如加载或错误。目前我能想到的唯一方法是包含状态的“响应”对象,但我似乎找不到实现它的方法。
就像是:
fun getUsers(): Flow<Lce<List<UserPojo>>>{
emit(Loading())
downloadFromApi()
if(downloadSuccessful)
return flowFromDatabase
else
emit(Error(throwable))
}
但是我遇到的一个明显问题是来自数据库的流是类型的Flow<List<UserPojo>>
,我不知道如何通过编辑流的状态来“丰富它”,而不会丢失来自数据库的订阅,也不会运行新的每次更新数据库时的网络调用(通过在地图转换中进行)。
希望它更清楚