Отметка чекбокса переезжает на другой элемент списка
В ленивом списке задач у каждого элемента есть чекбокс, состояние которого хранится внутри элемента. Список выводится без указания ключей:
LazyColumn {
items(tasks) { task ->
TaskRow(task)
}
}
Пользователь отмечает третью задачу, затем удаляет первую. Отметка оказывается на другой задаче. Почему так происходит?
- Состояние привязано к позиции: без стабильного ключа Compose считает, что в слоте остался прежний элемент
- Это особенность ленивого списка: в обычной колонке с прокруткой состояние строк не путается и ключи там не нужны
- Нужно обернуть состояние чекбокса в запоминание внутри строки — тогда оно перестанет зависеть от порядка элементов
- Задачи нужно сортировать по идентификатору: тогда после удаления порядок элементов перестанет сбиваться
- Список не помечен как неизменяемый, из-за этого Compose не может отличить один элемент от другого
