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

Android Compose:DragGesturesAfterLongPress回调无法获取最新itemList数据

问题原因解析

这是因为Compose的pointerInput作用域与lambda变量捕获的特性导致的,具体拆解两点:

  1. pointerInput的key未关联itemList,导致作用域未更新
    你的gridDragHandler里用了pointerInput(Unit),这里的Unit是固定不变的key。Compose中,pointerInput会根据传入的key判断是否需要重新创建内部的手势检测逻辑:只有当key变化时,才会重新执行lambda块里的代码。

因为你传的是Unit,所以不管外部的itemList怎么变化,这个pointerInput的作用域都只会在第一次重组时初始化一次,里面的onDragStart回调捕获的是第一次重组时的itemList引用,后续父组件传入新的itemList时,这个旧的lambda不会被替换,自然拿不到新数据。

  1. mutableStateListOf的引用不变,内部数据可追踪
    而你定义的list是remember { mutableStateListOf() },它的引用从始至终都是同一个,只是内部数据会通过LaunchedEffect(itemList)更新。所以不管什么时候访问list,都是同一个对象,能拿到最新的内部数据。
解决办法

如果要在onDragStart里拿到最新的itemList,可以做两种调整:

  • 给pointerInput传入itemList作为key:修改gridDragHandler的实现,把pointerInput(Unit)改成pointerInput(onDragStart, itemList)(或者直接关联itemList),这样当itemList变化时,pointerInput会重新创建手势逻辑,回调里就能捕获到新的itemList引用。
  • 直接使用list替代itemList:既然list已经同步了itemList的最新数据,在回调里直接用list即可,无需额外修改pointerInput。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:33:09