LazyColumn - Items 关键参数的用途?

Has*_*ssa 17 android kotlin android-jetpack-compose android-jetpack-compose-list

有人可以解释一下LazyListScope 的 items/itemsIndexed 函数中的“key”参数的主要用途是什么吗?如果我们指定该参数,我们会得到什么或不会得到什么?我不确定我是否理解与此参数相关的官方文档:

key - 代表该项目的稳定且唯一的密钥工厂。不允许对列表中的多个项目使用相同的密钥。密钥类型应该可以通过 Android 上的 Bundle 保存。如果传递 null,则列表中的位置将代表键。当您指定键时,滚动位置将根据键保持,这意味着如果您在当前可见项目之前添加/删除项目,则具有给定键的项目将保留为第一个可见项目。

Gab*_*tti 30

我认为官方文档提供了最好的答案:

默认情况下,每个项目的状态都根据该项目在列表中的位置进行设置。但是,如果数据集发生更改,这可能会导致问题,因为更改位置的项目实际上会丢失任何记住的状态。如果您想象在 a 中的场景,如果该行更改了项目位置,则用户将失去该行内的滚动位置。LazyRowLazyColumn

为了解决这个问题,您可以为每个项目提供一个稳定且唯一的密钥,并为参数提供一个块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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @JHowzer我相信这意味着在数据集更改期间不会更改的密钥。换句话说,假设您从列表中添加或删除项目,剩余的列表项键在操作后不应更改。 (2认同)