You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清空SharedFlow缓存?或转为MutableSharedFlow实现强制刷新

重置SharedFlow缓存并强制获取新数据的解决方案

方法一:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:03:13