我有一个待办事项应用程序,可以从视图模型读取
mutableStateListOf
数据。当添加 todoItem 时,它工作正常,删除它也工作正常,当我更新对象时,它不会更新其状态,状态也会更新。
但是当我导航到详细信息屏幕时,它会重新组合 UI,然后根据代码更新清单
package com.example.todoapp.data
import androidx.compose.runtime.mutableStateListOf
import androidx.lifecycle.ViewModel
class TodoData : ViewModel() {
private val todoData = mutableStateListOf<Todo>()
var getTodoList: List<Todo> = todoData
// WORKING FINE
fun addTodoItem(todo: Todo) {
todoData.add(todo)
}
// NOT WORKING BUT WORKS WHEN NAVIGATE TO A NEW COMPOSE AND RETURN BACK
fun updateStatus(todo: Todo, checked: Boolean = false) {
todoData.find { it == todo }?.let { task ->
task.isChecked = checked
}
}
// WORKING FIN
fun deleteItem(todo: Todo) {
todoData.remove(todo)
}
}
State 检测项目更改的方式是通过将值项目的前一个实例与新实例进行比较。由于您重复使用同一个实例并仅更改其
isChecked
属性,因此旧值和新值是相同的,因此它不会检测到任何更改。因此,可变类不适合用作状态的类型。
您应该将 Todo 类更改为不可变(仅
val
,而不是 var
)。当您想要更改该值时,请创建发生更改的先前值的副本。
fun updateStatus(todo: Todo, checked: Boolean = false) {
todoData[todoData.indexOf(todo)] =
todo.copy(isChecked = checked)
}