You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Compose列表重排序或过滤后点击返回错误ID问题

问题根因

你的问题核心是pointerInput修饰符的记忆化Key配置错误,导致点击事件闭包捕获的profile变量是旧值:

  • pointerInput是Compose的记忆化修饰符,你传入的Key为Unit,意味着只有Text组件首次进入组合树时才会执行内部的detectTapGestures逻辑,闭包捕获的profile永远是首次组合时的旧值。
  • 界面文本显示正常是因为Text的text参数没有做记忆化,每次重组都会读取最新的profile值渲染,和点击事件的记忆逻辑完全独立,所以会出现显示正确但点击返回旧ID的现象。
  • 额外加重问题的点是LazyColumn的itemsIndexed没有指定唯一Key,列表排序变化时LazyColumn默认按位置复用组件,会进一步放大变量陈旧的问题。

解决方案

1. 修改pointerInput的Key

将pointerInput的Key替换为当前的profile或profile.profileId,只要profile发生变化就会重新生成点击事件逻辑,捕获最新的变量值:

modifier = Modifier
    .pointerInput(profile) { // 把Unit替换为profile
        detectTapGestures(
            onLongPress = {
                Log.d(TAG, "onLongPress: ${profile.profileId}")
            },
            onTap = {
                Log.d(TAG, "onTap: ${profile.profileId}")
            },
        )
    }

2. 给LazyColumn列表项指定唯一Key

让LazyColumn按数据ID而非位置复用组件,避免排序/过滤时组件错位:

itemsIndexed(
    items = profiles.value,
    key = { _, profile -> profile.profileId } // 新增key参数,用唯一的profileId作为标识
) { _, profile ->
    // 原有Item渲染逻辑
}

修改完成后重新测试,点击事件就能拿到正确的profileId了。

内容的提问来源于stack exchange,提问作者Gattaccio7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 06:39:03