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

ArrayList未存入SavedStateHandle,进程重启后数据丢失原因咨询

问题原因及解决方法

核心原因

你的代码里存在一个关键问题:_wrongNumbers的setter仅在重新给变量赋值整个ArrayList对象时才会触发,而调用add()方法只是修改了已有ArrayList内部的元素,并没有改变_wrongNumbers变量的引用,因此setter中savedStateHandle["MY_KEY"] = value这行同步代码从未执行过。

也就是说,你添加元素后,SavedStateHandle里的"MY_KEY"对应的内容始终是初始化时的空列表,完全没有同步后续添加元素后的状态。当进程被杀死恢复时,自然只能读到初始的空集合。

解决方法

这里提供几种可行的修复方式:

方式1:手动同步SavedStateHandle

每次修改集合后,主动将集合重新存入SavedStateHandle:

fun addNumber(newNumber: Int) {
    _wrongNumbers.add(newNumber)
    savedStateHandle["MY_KEY"] = _wrongNumbers // 手动同步状态
}

方式2:修改集合时触发setter

通过重新赋值的方式触发setter,让SavedStateHandle自动保存:

fun addNumber(newNumber: Int) {
    // 创建新集合并添加元素,重新赋值触发setter
    _wrongNumbers = ArrayList(_wrongNumbers).apply { add(newNumber) }
}

方式3:使用SavedStateHandle的LiveData API(推荐)

利用SavedStateHandle内置的getLiveData方法,它会自动处理状态的保存与恢复,同时支持LiveData的观察者模式:

class MyViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    private val _wrongNumbers = savedStateHandle.getLiveData<ArrayList<Int>>("MY_KEY", arrayListOf())
    val wrongNumbers: LiveData<ArrayList<Int>> = _wrongNumbers

    fun addNumber(newNumber: Int) {
        val currentList = _wrongNumbers.value ?: arrayListOf()
        currentList.add(newNumber)
        _wrongNumbers.value = currentList // 重新赋值触发更新,自动同步到SavedStateHandle
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 11:42:37