一个解决方案是搬家
zIndex
将其转化为状态变量,并使其独立于
currentState.isDragging
并直接更改其值
onDragStart
和
onDragEnd
拉姆达斯。
@Composable
fun <T> DragTarget(
dataToDrop: T,
content: @Composable BoxScope.() -> Unit
) {
var dragOffset by remember { mutableStateOf(Offset.Zero) }
var currentPosition by remember { mutableStateOf(Rect.Zero) }
val currentState = LocalDragTargetInfo.current
var zIndex by remember { mutableFloatStateOf(0f) }
Box(
modifier = Modifier
.zIndex(zIndex)
.offset {
IntOffset(
dragOffset.x.roundToInt(),
dragOffset.y.roundToInt()
)
}
.onGloballyPositioned { layout ->
layout
.boundsInWindow()
.let { rect ->
currentPosition = rect
}
}
.pointerInput(dataToDrop) {
detectDragGestures(
onDragStart = {
currentState.isDragging = true
currentState.dataToDrop = dataToDrop
currentState.dragPosition = currentPosition
zIndex = 1f
},
onDrag = { change, dragAmount ->
change.consume()
dragOffset += dragAmount
currentState.dragPosition = currentPosition
},
onDragEnd = {
currentState.isDragging = false
dragOffset = Offset.Zero
currentState.dragPosition = Rect.Zero
zIndex = 0f
}
)
},
contentAlignment = Alignment.Center,
content = content
)
}
@Composable
fun TestView() {
Row(
modifier = Modifier.fillMaxSize(),
horizontalArrangement = Arrangement.spacedBy(
16.dp,
alignment = Alignment.CenterHorizontally
),
verticalAlignment = Alignment.CenterVertically
) {
DragTarget(dataToDrop = "Blue") {
Box(
modifier = Modifier
.size(50.dp)
.background(Color.Blue)
)
}
DragTarget(dataToDrop = "Green") {
Box(
modifier = Modifier
.size(50.dp)
.background(Color.Green)
)
}
DragTarget(dataToDrop = "Gray") {
Box(
modifier = Modifier
.size(50.dp)
.background(Color.LightGray)
)
}
DragTarget(dataToDrop = "Yellow") {
Box(
modifier = Modifier
.size(50.dp)
.background(Color.Yellow)
)
}
DragTarget(dataToDrop = "Red") {
Box(
modifier = Modifier
.size(50.dp)
.background(Color.Red)
)
}
}
}