我有一个包含 Slider 的列表,问题是当我滚动检测到点击事件的滑块并更改它时,请参阅附加的 gif
例外的行为是当用户滚动滑块时,不会在用户点击滑块时改变。
如何避免在滚动时更改滑块?
相关代码:
@Composable
fun TodoScreen(
items: List<TodoItem>,
currentlyEditing: TodoItem?,
onAddItem: (TodoItem) -> Unit,
onRemoveItem: (TodoItem) -> Unit,
onStartEdit: (TodoItem) -> Unit,
onEditItemChange: (TodoItem) -> Unit,
onEditDone: () -> Unit,
onPositionChanged: (TodoItem, Float) -> Unit
) {
Column {
val enableTopSection = currentlyEditing == null
TodoItemInputBackground(elevate = enableTopSection) {
if (enableTopSection) {
TodoItemEntryInput(onAddItem)
} else {
Text(
text = "Editing item",
style = MaterialTheme.typography.h6,
textAlign = TextAlign.Center,
modifier = Modifier
.align(Alignment.CenterVertically)
.padding(16.dp)
.fillMaxWidth()
)
}
}
LazyColumn(
modifier = Modifier.weight(1f),
contentPadding = PaddingValues(top = 8.dp)
) {
items(items = items) { todo ->
if (currentlyEditing?.id == todo.id) {
Log.d("ListTodo", "task: ${todo.task}")
TodoItemInlineEditor(
item = currentlyEditing,
onEditItemChange = onEditItemChange,
onEditDone = onEditDone,
onRemoveItem = { onRemoveItem(todo) }
)
} else {
TodoRow(
todo = todo,
onItemClicked = { onStartEdit(it) },
modifier = Modifier.fillParentMaxWidth(),
position = todo.position,
onPositionChanged = onPositionChanged
)
}
}
}
// For quick testing, a random item generator button
Button(
onClick = { onAddItem(generateRandomTodoItem()) },
modifier = Modifier
.padding(16.dp)
.fillMaxWidth(),
) {
Text("Add random item")
}
}
}
和
@Composable
fun TodoRow(
todo: TodoItem,
onItemClicked: (TodoItem) -> Unit,
modifier: Modifier = Modifier,
iconAlpha: Float = remember(todo.id) { randomTint() },
position: Float,
onPositionChanged: (TodoItem, Float) -> Unit
) {
Column() {
Row(
modifier
.clickable { onItemClicked(todo) }
.padding(horizontal = 16.dp, vertical = 8.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(todo.task)
Icon(
imageVector = todo.icon.imageVector,
tint = LocalContentColor.current.copy(alpha = iconAlpha),
contentDescription = stringResource(id = todo.icon.contentDescription)
)
}
Slider(value = position, onValueChange = { onPositionChanged(todo.copy(position = it), it) })
}
}