我有一个 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)
欲了解更多信息,请查看此问题和答案。