Page 1 of 1

Ziehen und Drop in Compose

Posted: 22 May 2025, 11:21
by Anonymous
Ich habe ein Problem mit dem Drag-and-Drop-Verhalten in Jetpack Compose. Ich verwende Lazyverticalgrid als Drop -Ziel. Wenn ich versuche, ein Element zu ziehen und es in dieses Raster zu verschieben, möchte ich: < /p>
das Element vorübergehend in die Liste hinzufügen, wenn es sich in der Zielzone befindet (als visuelles Schnappschuss). Ich erhalte den eingegebenen Rückruf korrekt, wenn das Element in das Ziel gezogen wird. Ich erhalte jedoch nicht die einxitierten oder angegebenen Rückrufe, wenn das Element herausgezogen wird oder die Geste endet. Es ist unmöglich zu erkennen, wann das Element die Zone verlässt oder der Luftwiderstand abgebrochen wird.

Code: Select all

                    LazyVerticalGrid(
columns = GridCells.Fixed(3),
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
items(inActiveGrips) { item ->
val jsonGrip = remember(item) { Gson().toJson(item) }
if (item.gripItemType == GripItemType.NONE) {
Box(
modifier = Modifier
.fillMaxWidth()
.dragAndDropTarget(
shouldStartDragAndDrop = { event ->
val androidEvent = event.toAndroidDragEvent()
val label = androidEvent.clipDescription.label
label == activeGripLabel
},
target = object : DragAndDropTarget {
override fun onStarted(event: DragAndDropEvent) {
super.onStarted(event)
wasDropped = false
}

override fun onDrop(event: DragAndDropEvent): Boolean {
wasDropped = true
val dragEvent = event.toAndroidDragEvent()
val intent =
dragEvent.clipData.getItemAt(0).intent
val json =
intent?.getStringExtra(activeGripTransferData)
?: return false
val movedGrip = Gson().fromJson(
json,
GripItemData::class.java
)
moveActiveToInActiveCallback(movedGrip.id)

return true
}

override fun onEntered(event: DragAndDropEvent) {
super.onEntered(event)
onMovedCallback.invoke(true)
}

override fun onExited(event: DragAndDropEvent) {
super.onExited(event)
onMovedCallback.invoke(false)
}

override fun onEnded(event: DragAndDropEvent) {
super.onEnded(event)
}
}
),
contentAlignment = Alignment.Center
) {
Box(
modifier = Modifier
.padding(top = 32.dp)
.size(12.dp)
.background(
Color.LightGray.copy(alpha = 0.4f),
shape = CircleShape
)
)
}
} else {
//some list item, doesn't matter
}
}
}