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

如何在StateFlow状态中正确处理多文件下载进度更新?

问题分析与解决方案

问题根源

你当前的setProgress函数在更新进度时,错误地用mapOf(fileName to value)创建了一个仅包含当前文件进度的新Map,直接替换了原有进度集合。这会导致:

  • 多文件下载时,每次更新一个文件进度,其他文件的进度会被完全清除,UI上就会看到这些文件的进度在有效数值和0之间反复波动;
  • 即使是单文件下载,若存在其他状态更新操作,也可能因进度集合被频繁替换引发异常。

正确实现方式

修改setProgress函数,基于当前已有的进度Map进行增量更新,保留其他文件的进度,仅修改目标文件的数值:

方式一(可变Map操作)

private fun setProgress(value: Int, fileName: String) {
    _state.update { currentState ->
        val updatedProgress = currentState.progress.toMutableMap().apply {
            this[fileName] = value
        }
        currentState.copy(progress = updatedProgress)
    }
}

方式二(不可变Map的plus操作符,更简洁)

private fun setProgress(value: Int, fileName: String) {
    _state.update { currentState ->
        currentState.copy(progress = currentState.progress + (fileName to value))
    }
}

这样修改后,每次进度更新只会修改对应文件的数值,其他文件的进度会被完整保留,UI能正确显示所有文件的实时进度,不会出现波动,其他状态也不会受到影响。

内容的提问来源于stack exchange,提问作者Roony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:33:14