mutableStateListOf 在更改时不会更新它的值

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

我有一个待办事项应用程序,可以从视图模型读取

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)
 }
}
kotlin navigation android-jetpack-compose mutablelivedata
1个回答
0
投票

State 检测项目更改的方式是通过将值项目的前一个实例与新实例进行比较。由于您重复使用同一个实例并仅更改其

isChecked
属性,因此旧值和新值是相同的,因此它不会检测到任何更改。因此,可变类不适合用作状态的类型。

您应该将 Todo 类更改为不可变(仅

val
,而不是
var
)。当您想要更改该值时,请创建发生更改的先前值的副本。

fun updateStatus(todo: Todo, checked: Boolean = false) {
    todoData[todoData.indexOf(todo)] =
        todo.copy(isChecked = checked)
}
© www.soinside.com 2019 - 2024. All rights reserved.