首页 > 解决方案 > Jetpack 撰写状态没有得到观察

问题描述

我正在为 jetpack compose 中的基本 Todo 应用程序编写代码,我知道 mutablestateof() 负责重新组合 ui,但是 Lazycolumn 在从列表中删除项目后没有得到更新,尽管它在我关闭应用程序和再次启动时得到更新它

待办事项列表屏幕

    @Composable
fun TodoListScreen(
    viewModel: TodoViewModel,
    onClick: () -> Unit
) {

    val state = rememberLazyListState()
    var items = remember {
        viewModel.todoItems
    }


    viewModel.getTodos()
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        AddNewTodoButton(onClick = onClick)
        LazyColumn(state = state) {
            items(items.value) { item ->
                TodoItem(viewModel, item)
            }
        }


    }
}

TodoItem // 单击一个 Todo 元素会从数据库中删除

@Composable
fun TodoItem(
    viewModel: TodoViewModel,
    todoItem: TodoEntity
) {
    Card(
        modifier = Modifier
            .padding(8.dp)
            .height(100.dp)
            .fillMaxWidth(),
        elevation = 8.dp,
        shape = RoundedCornerShape(10.dp)
    ) {
        Row(modifier = Modifier
            .padding(8.dp)
            .clickable {
                viewModel.deleteTodo(todoItem)
            }
        ) {
            Text(
                text = todoItem.description,
                modifier = Modifier
                    .padding(start = 8.dp)
                    .align(Alignment.CenterVertically)
            )
        }

    }

}

视图模型

@HiltViewModel
class TodoViewModel @Inject constructor(val repo: TodoRepo):ViewModel() {

   val todoItems = mutableStateOf<List<TodoEntity>>(listOf())
    fun getTodos(){
        viewModelScope.launch {
            todoItems.value =( repo.getTodos())
        }
    }

    fun addTodo(todo:TodoEntity){
        viewModelScope.launch {
            repo.addTodo(todo)
        }
    }

    fun deleteTodo(todo:TodoEntity){
        viewModelScope.launch {
            repo.deleteTodo(todo)
        }
    }
}

标签: android

解决方案


推荐阅读