如何向MutableLiveData中存储的List添加数据?
错误原因
toMutableList()方法会生成一个全新的可变列表副本,你调用add方法修改的是这个临时副本,并没有改动 MutableLiveData 内部存储的原列表数据- MutableLiveData 只有在主动更新其
value属性时,才会修改内部存储的值并通知观察者,仅修改value指向对象的内部属性不会触发更新
正确实现方式
修改后的代码如下:
class WriteRoutineViewModel : ViewModel() { private var _items: MutableLiveData<List<RoutineModel>> = MutableLiveData(listOf()) val items: LiveData<List<RoutineModel>> = _items fun addRoutine(workout: String) { val item = RoutineModel(workout, "TEST") // 生成包含新元素的新列表,重新赋值给LiveData _items.value = _items.value.orEmpty() + item } }
如果更习惯显式转可变列表的写法,也可以用下面的等价写法:
fun addRoutine(workout: String) { val item = RoutineModel(workout, "TEST") val currentList = _items.value.orEmpty() val mutableList = currentList.toMutableList() mutableList.add(item) _items.value = mutableList }
注意事项
- 每次修改列表都生成新的列表实例赋值给LiveData,是官方推荐的最佳实践,避免因为同一个实例引用导致LiveData不触发更新
- 不建议直接将LiveData泛型声明为
MutableList后反复修改同一个实例,容易出现状态同步问题
内容的提问来源于stack exchange,提问作者ybybyb
相关产品推荐
相关产品推荐

