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

JetPack Compose:重组后DragAndDropSource传输数据不更新问题求助

问题分析与解决方案

核心问题

你遇到的是Compose重组机制中Composable实例复用导致状态错位的问题:当列表项被移除后,后续的ItemView会被Compose基于位置复用旧的实例,而这些实例内部的状态(包括dragAndDropSource中捕获的item值)没有同步更新,导致拖动时仍使用已移除项的旧数据。

解决方案

1. 给列表项添加唯一Key

确保Compose能正确识别每个列表项的身份,避免基于位置复用ItemView实例。在渲染列表时,用key函数包裹每个ItemView,绑定唯一标识(比如item本身,需保证item值唯一):

// 假设你的列表渲染逻辑如下
items.forEach { item ->
    key(item) {
        ItemView(
            modifier = Modifier,
            item = item
        )
    }
}

2. 用rememberUpdatedState捕获最新的item值

dragAndDropSource中的lambda会在首次组合时捕获item的引用,后续重组若lambda未重新创建,会一直使用旧值。用rememberUpdatedState包装item,确保lambda能获取到最新的item:

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun ItemView(
    modifier: Modifier = Modifier,
    item: String
) {
    // 确保lambda中能获取最新的item值
    val currentItem by rememberUpdatedState(item)

    Box(
        modifier = modifier
            .dragAndDropSource {
                detectTapGestures(onPress = {
                    Log.d("Source", "starting to drag ${currentItem}")
                    startTransfer(
                        DragAndDropTransferData(
                            ClipData.newPlainText("product", currentItem),
                            localState = currentItem,
                            flags = View.DRAG_FLAG_OPAQUE
                        )
                    )
                })
            }
            .fillMaxWidth()
            .height(48.dp),
        contentAlignment = Alignment.CenterStart
    ) {
        Text(
            text = item,
            color = Color.Black
        )
    }
}

原因说明

  • Key的作用:Compose默认通过位置判断是否复用Composable实例,添加唯一Key后,Compose会根据Key识别每个项的唯一性,当列表结构变化时,会为新位置的项创建全新的ItemView实例,而非复用旧实例的状态。
  • rememberUpdatedState的作用:它会在item更新时自动更新内部的引用,确保dragAndDropSource中的lambda每次执行都能拿到最新的item值,避免因lambda捕获旧引用导致的数据错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:47:12