我有一个返回Flow<Status<T>>
的存储库。Status
可以是Status.Loading
或Status.Data
。我希望Flow
发出Status.Loading
,以防存储库在X毫秒内没有返回任何值。
在伪代码中,它看起来像这样:
repository.fetchData()
.emitDataOrLoading()
.collect {
when (it) {
is Status.Loading -> // show loading indicator in case no data after X milliseconds
is Status.Data -> // We have received the data.
}
}
所以我正在寻找如何实现.emitDataOrLoading()
2条答案
按热度按时间e4yzc0pl1#
这可以使用
channelFlow
构建器创建。也许有一个更简单的方法与运营商,但我不能拿出一个。如果
fetchData()
是一个一次性的挂起函数,你可以这样做:使用方法:
编辑:基于Vivek Gupta的评论和回答,使用
debounce
构建上述代码的简单方法。这是因为debounce
被优化为立即通过有限流的最后一个值。如果
fetchData()
是一个流,例如一个无限监视数据库的流,你可以构建一个流操作符,它只在第一项很慢的情况下显示加载状态:oyxsuwqo2#
假设你有一个密封的类
你的fetchData()是
和Repository方法,它正在发出流
你可以使用debounce创建一个超时的方法。它不会延迟成功的响应。getDataWithLoadingDelay只会延迟getData流中数据值的初始发射,直到经过去抖动时间为止。一旦getData流发出了一个数据值,它将立即被getDataWithLoadingDelay流作为Status.Data值发出,没有任何进一步的延迟。
如果在去抖动期间没有发出任何值,它将发出一个Status.Loading值,以指示仍在提取数据。