【发布时间】:2020-10-09 11:22:52
【问题描述】:
我已经启动了一个待办事项列表应用程序来进入 jetpack compose。这是我到目前为止所得到的。
我有一个 Todo 的可组合项:
@Composable
fun Todo(
todo: TodoItem = TodoItem()
) {
Row() {
Checkbox
Spacer
if (todo.editing)
EditTodo(todo, onEditingFinished = onEditingFinished)
else
TodoText(todo = todo)
}
}
我在这里省略了样式位以突出显示实际组件
供参考,这里是TodoItem:
data class TodoItem(
val id: String,
val title: String,
val done: Boolean,
val editing: Boolean,
val createdAt: Date,
)
TodoText 方法是我认为我的问题所在:
@Composable
private fun TodoText(todo: TodoItem) {
Text(
text = todo.title,
style = if (todo.done)
TextStyle(
textDecoration = TextDecoration.LineThrough,
color = Color.LightGray,
fontSize = 18.sp,
)
else
TextStyle(
textDecoration = TextDecoration.None,
color = Color.Black,
fontSize = 18.sp,
)
)
}
如果待办事项完成,我想相应地更改文本样式,从下面的 gif 中可以看出,颜色正确更改,但装饰保持为LineThrough:
也就是说,我不知道到底发生了什么。我确实把这一切都放在了LazyColumFor 中,我可能没有正确地回收视图,这里还有一个状态可变的视图模型......总而言之,这里可能有更多的事情在起作用。我已将代码添加到 github。如果你想检查它,请使用这个branch。我计划通过代码更改不断更新master。
【问题讨论】:
-
我认为你应该在这里做的是存储所选项目的状态,你可以用 mutableStateOf 做到这一点并存储完成的布尔值,然后你的代码应该在你的时候对该状态做出反应单击该项目,这将根据该状态重新组合可组合项。我看到的问题是它是第一次组合,但是当你点击它时,它只对处理点击的第一个可组合做出反应,第二个已经组合了 1 次并且需要在任何状态变化时重新组合
-
我不确定我是否遵循。如果我理解正确,我会这样做,但要针对整个列表。是的,我承认它可能不是最高效的解决方案。对列表的每次更改都会更改整个状态。如果状态更新的这一部分不起作用,怎么会取消选中待办事项并且文本的颜色会发生变化?
-
这部分可以查看状态codelabcodelabs.developers.google.com/codelabs/jetpack-compose-state/…
-
我得到了状态概念,但我很难理解这是怎么回事。如果状态是问题所在,视图的某些部分如何正确更新?
标签: android android-jetpack-compose