Я пытаюсь написать ответ на этот вопрос, но при тестировании своего кода обнаружил ошибку, которую не могу понять, как исправить.
Приложение диспетчер задач, в котором вы можете перетаскивать задачи между очередями: «Сделать», «В процессе» и «Готово». В каждой очереди есть список задач, и перетаскивание задачи перемещает ее из одной очереди в другую.
Вот минимальный пример моего кода для воспроизведения проблемы:
Код в основном работает, но в некоторых сценариях происходит неожиданное поведение: Сценарий 1:
Переместить задачу 2 из «Выполняется» в «Сделать» --> Работает нормально.
< li>Переместить задачу 1 из списка дел в список задач --> Работает нормально.
Переместить задачу 4 из списка задач в «Выполняется» --> ОШИБКА: «Задача 1» дублируется, а задача 4 не перемещается.
Сценарий 2:
Переместить задачу 1 из задачи в задачу (та же очередь) --> работает нормально.
Переместить задачу 4 из списка дел в список дел (та же очередь) --> ОШИБКА: ничего не происходит.
При отладке я заметил, что иногда в лямбду onTaskDrop передается неправильная задача. Например, даже если я перетаскиваю задачу 1, обрабатывается другая задача.
Похоже, что localState, переданный в процессе перетаскивания, может не всегда соответствовать перетаскиваемой задаче.
Похоже, проблема связана с порядком задач в очереди!
Что может быть причиной этих проблем и как их устранить?>
Я пытаюсь написать ответ на этот вопрос, но при тестировании своего кода обнаружил ошибку, которую не могу понять, как исправить. Приложение диспетчер задач, в котором вы можете перетаскивать задачи между очередями: «Сделать», «В процессе» и «Готово». В каждой очереди есть список задач, и перетаскивание задачи перемещает ее из одной очереди в другую. Вот минимальный пример моего кода для воспроизведения проблемы: [code]implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5") [/code] [code]class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> App(modifier = Modifier .padding(innerPadding) ) } } } }
passe data to be used later when dropping the card localState = DraggedData(task, queueType) ) ) } ) } .background( color = Color.LightGray, shape = RoundedCornerShape(8.dp) ) .padding(vertical = 4.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.spacedBy(8.dp) ) { Text(text = task.title) Text(text = task.description) } }
@OptIn(ExperimentalFoundationApi::class) @Composable fun QueueTask( queueType: QueueType, tasks: List, modifier: Modifier = Modifier, onTaskDrop: (Task, QueueType) -> Unit ) { val dropTarget = remember { object : DragAndDropTarget { override fun onDrop(dragStartEvent: DragAndDropEvent): Boolean { val dropEvent = dragStartEvent.toAndroidDragEvent()
// get the dragged data from localState passed earlier val draggedTaskData = dropEvent.localState as? DraggedData val droppedTask = draggedTaskData?.task droppedTask?.let { onTaskDrop(it, draggedTaskData.originQueue) } return true } } }
val todoTasks = viewModel.todoTasks val inProgressTasks = viewModel.inProgressTasks val doneTasks = viewModel.doneTasks
Row( modifier = modifier, horizontalArrangement = Arrangement.spacedBy(10.dp) ) { QueueTask( queueType = QueueType.TodoQueue, tasks = todoTasks, modifier = Modifier.weight(1f), onTaskDrop = { task, fromQueueType -> viewModel.moveTask(task, fromQueueType, QueueType.TodoQueue) } ) QueueTask( queueType = QueueType.InProgressQueue, tasks = inProgressTasks, modifier = Modifier.weight(1f), onTaskDrop = { task, fromQueueType -> viewModel.moveTask(task, fromQueueType, QueueType.InProgressQueue) } ) QueueTask( queueType = QueueType.DoneQueue, tasks = doneTasks, modifier = Modifier.weight(1f), onTaskDrop = { task, fromQueueType -> viewModel.moveTask(task, fromQueueType, QueueType.DoneQueue) } ) } } [/code] Код в основном работает, но в некоторых сценариях происходит неожиданное поведение: [b]Сценарий 1:[/b] [list] [*]Переместить задачу 2 из «Выполняется» в «Сделать» --> Работает нормально. < li>Переместить задачу 1 из списка дел в список задач --> Работает нормально. [*]Переместить задачу 4 из списка задач в «Выполняется» --> ОШИБКА: «Задача 1» дублируется, а задача 4 не перемещается. [/list] [img]https://i.sstatic.net/pzWxmyRf.gif[/img]
[b]Сценарий 2: [/b] [list] [*]Переместить задачу 1 из задачи в задачу (та же очередь) --> работает нормально. Переместить задачу 4 из списка дел в список дел (та же очередь) --> ОШИБКА: ничего не происходит. [/list] [img]https://i.sstatic.net/LwKZbWdr.gif[/img] При отладке я заметил, что иногда в лямбду onTaskDrop передается неправильная задача. Например, даже если я перетаскиваю задачу 1, обрабатывается другая задача. Похоже, что localState, переданный в процессе перетаскивания, может не всегда соответствовать перетаскиваемой задаче. Похоже, проблема связана с порядком задач в очереди! Что может быть причиной этих проблем и как их устранить?>
Я пытаюсь написать ответ на этот вопрос, но при тестировании своего кода обнаружил ошибку, которую не могу понять, как исправить.
Приложение диспетчер задач, в котором вы можете перетаскивать задачи между очередями: «Сделать», «В процессе» и...
Я пытаюсь написать ответ на этот вопрос, но при тестировании своего кода обнаружил ошибку, которую не могу понять, как исправить.
Приложение диспетчер задач, в котором вы можете перетаскивать задачи между очередями: «Сделать», «В процессе» и...
У меня есть родительская строка и внутренние строки, каждая внутренняя строка содержит изображение, поэтому я хочу, чтобы они отображались в центре рядом. В настоящее время я даже указал HorizonArrangement как Center, но он все равно не отображается...