如何清空SharedFlow缓存?或转为MutableSharedFlow实现强制刷新
方法一:用MutableSharedFlow做代理层
自己维护一个MutableSharedFlow,把原API的Flow数据转发进去,这样既能调用resetReplayCache()清空缓存,还能主动触发重新获取数据。
class User(val id: String) { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) private val _sharedFlow = MutableSharedFlow<Data>(replay = 1) val flow: SharedFlow<Data> = _sharedFlow init { // 首次加载数据 fetchAndEmitData() } fun forceFetchNewData() { // 先清空缓存 _sharedFlow.resetReplayCache() // 重新拉取数据并发射 fetchAndEmitData() } private fun fetchAndEmitData() { scope.launch { Api.observeData(id) .map { result -> transformData(result) } .collect { data -> _sharedFlow.emit(data) } } } // 对象销毁时取消协程,避免内存泄漏 fun destroy() { scope.cancel() } }
方法二:用触发信号自动刷新缓存
通过一个MutableStateFlow作为刷新开关,每次触发时让原Flow重新订阅,新数据会自动覆盖shareIn生成的SharedFlow缓存。
class User(val id: String) { private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) // 刷新触发信号,更新值就会触发重新订阅 private val refreshTrigger = MutableStateFlow(Unit) val flow: SharedFlow<Data> = refreshTrigger .flatMapLatest { // 每次触发都重新订阅原API Api.observeData(id).map { result -> transformData(result) } } .shareIn(scope, SharingStarted.WhileSubscribed(), replay = 1) fun forceFetchNewData() { // 更新触发信号,自动触发重新拉取并覆盖缓存 refreshTrigger.value = Unit } fun destroy() { scope.cancel() } }
注意事项
- 方法一适合需要手动精准控制缓存的场景,完全掌握数据发射和缓存清空的时机。
- 方法二更简洁,利用Flow的操作符特性自动处理订阅和缓存更新,不需要手动调用清空方法。
- 两种方案都要记得在对象生命周期结束时取消协程作用域,防止内存泄漏。
内容的提问来源于stack exchange,提问作者user2498079
相关产品推荐
相关产品推荐

