我有一个 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
中显示的更改。我该如何解决这个问题?
如果有人仍在寻找,我找到了一个解决方案。
我刚刚在屏幕中定义了一个新的
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 */ }