Выбор ответа Senior Compose: состояние и side-effects обновлено

rememberUpdatedState в эффекте

Вопрос

Экран-заставка через 3 секунды вызывает onTimeout. Родитель может передать новую лямбду. Как вызвать актуальную лямбду, не перезапуская таймер?

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

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

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

Коротко

Правильный ответ: rememberUpdatedState(onTimeout) и LaunchedEffect(Unit). rememberUpdatedState хранит последнее значение параметра и обновляет его при каждой рекомпозиции, а эффект с ключом Unit не перезапускается.

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

  1. LaunchedEffect(onTimeout) { delay(3000); onTimeout() }
  2. SideEffect { delay(3000); onTimeout() } после рекомпозиции
  3. val cb = remember { onTimeout } и LaunchedEffect(Unit) { cb() }
  4. rememberUpdatedState(onTimeout) и LaunchedEffect(Unit)правильный ответ

Разбор

rememberUpdatedState хранит последнее значение параметра и обновляет его при каждой рекомпозиции, а эффект с ключом Unit не перезапускается. Ключ onTimeout перезапускал бы таймер при каждой новой лямбде. SideEffect не корутина, delay там нельзя. remember { onTimeout } запомнит первую лямбду и не обновит её.

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

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