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

