【问题标题】:LazyColumn - Items Key parameter purpose?LazyColumn - 项目关键参数用途?
【发布时间】:2021-10-17 18:15:04
【问题描述】:
谁能解释一下 LazyListScope 的 items/itemsIndexed 函数中 'key' 参数的主要用途是什么?如果我们指定该参数,我们会得到什么或没有得到什么?我不确定我是否了解与此参数相关的官方文档:
key - 代表项目的稳定且唯一的密钥工厂。使用
不允许列表中的多个项目使用相同的键。类型
密钥应该可以通过 Android 上的 Bundle 保存。如果传递了 null
列表中的位置将代表键。当您指定
键滚动位置将根据键保持,这
表示如果您在当前可见项目之前添加/删除项目该项目
与给定的键将被保留为第一个可见的。
【问题讨论】:
标签:
android
kotlin
android-jetpack-compose
【解决方案1】:
我认为最好的答案是official doc:
默认情况下,每个项目的状态都是针对列表中项目的位置键控。但是,如果数据集发生更改,这可能会导致问题,因为更改位置的项目实际上会丢失任何记住的状态。如果您想象LazyRow 在LazyColumn 中的场景,如果行更改项目位置,则用户将失去其在行内的滚动位置。
为了解决这个问题,您可以为每个项目提供一个稳定且唯一的密钥,为 key 参数提供一个块。 提供稳定的密钥可以使项目状态在数据集更改时保持一致:
@Composable
fun MessageList(messages: List<Message>) {
LazyColumn {
items(
items = messages,
key = { message ->
// Return a stable + unique key for the item
message.id
}
) { message ->
MessageRow(message)
}
}
}