android - LazyColumn - 项目关键参数用途?
问题描述
有人可以解释一下LazyListScope 的 items/itemsIndexed 函数中“key”参数的主要目的是什么吗?如果我们指定该参数,我们会得到什么或没有得到什么?我不确定我是否了解与此参数相关的官方文档:
key - 代表项目的稳定且唯一的密钥工厂。不允许对列表中的多个项目使用相同的键。密钥的类型应该可以通过 Android 上的 Bundle 保存。如果传递了 null,则列表中的位置将代表键。当您指定键时,滚动位置将基于键保持,这意味着如果您在当前可见项目之前添加/删除项目,则具有给定键的项目将保留为第一个可见项目。
解决方案
我认为官方文档提供了最佳答案:
默认情况下,每个项目的状态都根据项目在列表中的位置进行键控。但是,如果数据集发生更改,这可能会导致问题,因为更改位置的项目实际上会丢失任何记住的状态。如果您想象在 a 内的场景,如果该行更改项目位置,则用户将失去其在该行内的滚动位置。
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)
}
}
}
推荐阅读
- google-bigquery - 行的简单 SQL 聚合,其中值是整数数组
- abap - 外部视图已激活,但语法错误仍然存在
- javascript - 为什么我尝试提交表单时没有做任何事情?
- python - python - 如何通过python中的热图减法显示两个矩阵的差异?
- visual-studio - 类中方法参数的数量错误
- c# - 没有使用 PromptValidator,而是在 ChoiceExtractor 中抛出错误
- javascript - 用javascript创建一个“临时css”值得吗?
- c++ - Qt5: Call main-application functions from within a plugin
- macos - process.WaitForExit() 不在 Mac OS X 中等待 - ASP.NET Core 2.2
- html - 如何更改我的代码以使其更具响应性?