问题描述
我在 viewModel 中使用 stateFlow 来获取带有密封类的 api 调用结果,如下所示:
sealed class Resource<out T> {
data class Loading<T>(val data: T?): Resource<T>()
data class Success<T>(val data: T?): Resource<T>()
data class Error<T>(val error: Exception,val data: T?,val time: Long = System.currentTimeMillis()): Resource<Nothing>()
}
class VehicleViewModel @ViewModelInject constructor(application: Application,private val vehicleRepository: VehicleRepository): BaseViewModel(application) {
val vehiclesResource: StateFlow<Resource<List<Vehicle>>> = vehicleRepository.getVehicles().shareIn(viewModelScope,SharingStarted.Eagerly,replay = 1)
}
我想在我的 UI 中建议一个按钮,以便如果 api 调用失败,用户可以重试调用。我知道流上有一个 retry
方法,但不能手动调用它,因为它仅在发生异常时触发。
一个常见的用例是:用户没有互联网连接,当 api 调用返回网络异常时,我向用户显示一条消息,告诉他检查其连接,然后使用重试按钮(或通过检测到设备现在已连接,无论如何),我重试流程。
但我想不出一个方法来做到这一点,因为你不能,比如调用 flow.retry()
。一旦发生异常,实际的 retry
方法将被调用。我不想在不要求用户检查其连接的情况下立即重试,这是没有意义的。
实际上,我找到的唯一解决方案是在按下重试按钮时重新创建 Activity,以便重置流程,但这对于性能来说当然很糟糕。
没有流程,解决方案很简单,并且有很多示例,您只需要重新启动工作,但我找不到使用流程正确执行此操作的方法。我的存储库中有本地房间数据库和远程服务之间的逻辑,flow api 非常好,所以我也想在这个用例中使用它。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)