Выбор ответа Senior Compose: состояние и side-effects обновлено
rememberUpdatedState в эффекте
Вопрос
Экран-заставка через 3 секунды вызывает onTimeout. Родитель может передать новую лямбду. Как вызвать актуальную лямбду, не перезапуская таймер?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: rememberUpdatedState(onTimeout) и LaunchedEffect(Unit). rememberUpdatedState хранит последнее значение параметра и обновляет его при каждой рекомпозиции, а эффект с ключом Unit не перезапускается.
Варианты ответа
LaunchedEffect(onTimeout) { delay(3000); onTimeout() }SideEffect { delay(3000); onTimeout() }после рекомпозицииval cb = remember { onTimeout }иLaunchedEffect(Unit) { cb() }rememberUpdatedState(onTimeout)иLaunchedEffect(Unit)правильный ответ
Разбор
rememberUpdatedState хранит последнее значение параметра и обновляет его при каждой рекомпозиции, а эффект с ключом Unit не перезапускается. Ключ onTimeout перезапускал бы таймер при каждой новой лямбде. SideEffect не корутина, delay там нельзя. remember { onTimeout } запомнит первую лямбду и не обновит её.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.