如何解决Kotlin Flow - 带有结果密封类的 Retrofit 通用函数
我最近在改造的存储库中使用 Flow
。
结果的密封类
enum class ApiStatus{
SUCCESS,ERROR,LOADING
}
sealed class ApiResult <out T> (val status: ApiStatus,val data: T?,val message:String?) {
data class Success<out R>(val _data: R?): ApiResult<R>(
status = ApiStatus.SUCCESS,data = _data,message = null
)
data class Error(val exception: String): ApiResult<Nothing>(
status = ApiStatus.ERROR,data = null,message = exception
)
data class Loading<out R>(val _data: R?,val isLoading: Boolean): ApiResult<R>(
status = ApiStatus.LOADING,message = null
)
}
3 种状态的示例存储库调用 - 加载、错误、成功
fun googleDisconnect() = flow {
emit(ApiResult.Loading(null,true))
val call = userDataSource.self("v4").googleDisconnect()
if(call.isSuccessful) {
emit(ApiResult.Success(call.body()))
} else {
emit(ApiResult.Error("Google Disconnect Failed"))
}
}
但是,我的存储库中有多个具有不同功能的网络调用。有没有办法为这些 flow
编写一个通用函数,以便可以将这些流发送到流构建器?
解决方法
最后我得到了自己的答案。我想知道这是否会有所帮助,但我会发布我的答案。
fun <T> toResultFlow(call: suspend () -> Response<T>?) : Flow<ApiResult<T>?> {
return flow {
emit(ApiResult.Loading())
val c = call() <-- have to initialize the call method first
c?.let {
try{
if(c.isSuccessful) {
c.body()?.let {
emit(ApiResult.Success(it))
}
} else {
c.errorBody()?.let {
val error = it.string()
it.close()
emit(ApiResult.Error(error))
}
}
}catch (e: Exception) {
emit(ApiResult.Error(e.toString()))
}
}
}.flowOn(Dispatchers.IO)
}
然后,将挂起函数作为 lambda 传入
fun googleDisconnect() = toResultFlow {
userDataSource.self("v4").googleDisconnect()
}
最后,toResultFlow
将返回 FlowT
是您首选的数据类型!沃拉!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。