Выбор ответа Junior Compose: состояние и side-effects спрашивают часто обновлено

mutableStateOf без remember

Вопрос

Что не так с кодом? Счётчик всегда показывает 0.

@Composable
fun Counter() {
    var count by mutableStateOf(0)
    Button(onClick = { count++ }) { Text("$count") }
}

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Без remember состояние создаётся заново при рекомпозиции и снова равно 0. Клик меняет состояние и запускает рекомпозицию, но при повторном вызове функции mutableStateOf(0) создаёт новое состояние с нулём. remember { mutableStateOf(0) } сохраняет объект между рекомпозициями.

Варианты ответа

  1. mutableStateOf нельзя использовать с примитивами вроде Int, нужен mutableIntStateOf
  2. count++ не работает с делегатом by: инкремент меняет копию, а не сам State
  3. Button не вызывает рекомпозицию родителя, пока у него нет своего состояния
  4. Без remember состояние создаётся заново при рекомпозиции и снова равно 0правильный ответ

Разбор

Клик меняет состояние и запускает рекомпозицию, но при повторном вызове функции mutableStateOf(0) создаёт новое состояние с нулём. remember { mutableStateOf(0) } сохраняет объект между рекомпозициями. С Int и by всё работает, Lint даже подсвечивает эту ошибку.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.