Android Compose:DragGesturesAfterLongPress回调无法获取最新itemList数据
问题原因解析
这是因为Compose的pointerInput作用域与lambda变量捕获的特性导致的,具体拆解两点:
- pointerInput的key未关联itemList,导致作用域未更新
你的gridDragHandler里用了pointerInput(Unit),这里的Unit是固定不变的key。Compose中,pointerInput会根据传入的key判断是否需要重新创建内部的手势检测逻辑:只有当key变化时,才会重新执行lambda块里的代码。
因为你传的是Unit,所以不管外部的itemList怎么变化,这个pointerInput的作用域都只会在第一次重组时初始化一次,里面的onDragStart回调捕获的是第一次重组时的itemList引用,后续父组件传入新的itemList时,这个旧的lambda不会被替换,自然拿不到新数据。
- 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
相关产品推荐
相关产品推荐

