【问题标题】:TextDecoration not applying in LazyColumn itemTextDecoration 不适用于 LazyColumn 项目
【发布时间】: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 次并且需要在任何状态变化时重新组合
  • 我不确定我是否遵循。如果我理解正确,我会这样做,但要针对整个列表。是的,我承认它可能不是最高效的解决方案。对列表的每次更改都会更改整个状态。如果状态更新的这一部分不起作用,怎么会取消选中待办事项并且文本的颜色会发生变化?
  • 我得到了状态概念,但我很难理解这是怎么回事。如果状态是问题所在,视图的某些部分如何正确更新?

标签: android android-jetpack-compose


【解决方案1】:

显然,这是我使用的 compose 版本的问题,即1.0.0-alpha04

1.0.0-alpha06 上,问题不再发生。

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2021-12-08
    • 2021-04-16
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2011-05-12
    • 2021-05-15
    相关资源
    最近更新 更多