VieeModel 在更改后不会更新对象列表。如何解决这个问题?

问题描述 投票: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)

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

请确保您还设置了

LazyColumn
的密钥:

itemsIndexed(tasks, key = { _, task -> task.hashCode() }) { index, task -> /* Your code */ }
© www.soinside.com 2019 - 2024. All rights reserved.