如何在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
相关产品推荐
相关产品推荐

