VieModel 在更改后不会更新对象列表。怎么解决?

问题描述 投票:0回答:1

我有一个 ViewModel 类:

class ItemsModel : ViewModel() {

    private val _tasks = MutableStateFlow<List<TaskItem>>(listOf())

    val tasks = _tasks.asStateFlow()

    fun onTaskDone(index: Int) {
        _tasks.value = _tasks.value.toMutableList().apply {
            get(index).task.done = !get(index).task.done
        }
    }

    fun onTaskRemove(index: Int) {
        val listSize = _tasks.value.size
        _tasks.value = _tasks.value.toMutableList().apply {
            if (index < listSize)
                removeAt(index)
        }
    }


    fun addTask(task: String) {
        _tasks.value = _tasks.value.toMutableList().apply {
            add(TaskItem(this.size + 1, Task(task)))
        }
    }
}

TaskItem
的数据类:

@Parcelize
data class TaskItem(var index: Int, var task: Task) : Parcelable

Task
的数据类:

@Parcelize
data class Task(var task: String = "", var done: Boolean = false) : Parcelable

在目标可组合屏幕中,我这样称呼它:

...
val itemsModel: ItemsModel = viewModel()
val tasks by itemsModel.tasks.collectAsState()
...

每当我称之为

itemsModel.onTaskDone(index)
时,
LazyColumn
不会更新,直到对列表进行其他更改,例如将新任务项添加到列表中。

到目前为止,据我所知,由于我更改了对象

LazyColumn
中的值,该值是
Task
中的变量,因此该更改不会发生在
TaskItem
上。如果我有
String
代替
Task
,变化可能会立即出现,不是吗?

无论如何,我需要获得

LazyColumn
中显示的更改。有什么办法解决吗?

提前多谢。

viewmodel android-jetpack-compose-lazy-column
1个回答
1
投票

如果有人仍在寻找,我找到了一个解决方案。

我刚刚在屏幕中定义了一个新的

SnapshotStateList
变量:

var tasks = remember { mutableStateListOf<Task>() }

它允许更改列表中的数据并重新组合

LazyColumn
,如下所示:

val item = tasks[index]
tasks[index] = item.copy(done = !tasks[index].done)

欲了解更多信息,请查看此问题和答案

© www.soinside.com 2019 - 2024. All rights reserved.