Вступить в клуб →
средняявопросJetpack Compose и состояние экрана

Отметка чекбокса переезжает на другой элемент списка

В ленивом списке задач у каждого элемента есть чекбокс, состояние которого хранится внутри элемента. Список выводится без указания ключей:

LazyColumn {
    items(tasks) { task ->
        TaskRow(task)
    }
}

Пользователь отмечает третью задачу, затем удаляет первую. Отметка оказывается на другой задаче. Почему так происходит?

  • Состояние привязано к позиции: без стабильного ключа Compose считает, что в слоте остался прежний элемент
  • Это особенность ленивого списка: в обычной колонке с прокруткой состояние строк не путается и ключи там не нужны
  • Нужно обернуть состояние чекбокса в запоминание внутри строки — тогда оно перестанет зависеть от порядка элементов
  • Задачи нужно сортировать по идентификатору: тогда после удаления порядок элементов перестанет сбиваться
  • Список не помечен как неизменяемый, из-за этого Compose не может отличить один элемент от другого

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела