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

Корутина по клику в Compose

Вопрос

Как запустить анимацию скролла listState.animateScrollToItem(0) по нажатию кнопки?

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

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

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

Коротко

Правильный ответ: rememberCoroutineScope() и scope.launch { } в onClick. rememberCoroutineScope даёт scope, привязанный к композиции: корутины отменятся, когда composable уйдёт с экрана.

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

  1. LaunchedEffect(Unit) { } прямо внутри onClick
  2. GlobalScope.launch(Dispatchers.Main) { } в onClick
  3. rememberCoroutineScope() и scope.launch { } в onClickправильный ответ
  4. runBlocking { } в onClick, анимация ведь короткая

Разбор

rememberCoroutineScope даёт scope, привязанный к композиции: корутины отменятся, когда composable уйдёт с экрана. Его используют для запуска из колбэков. LaunchedEffect это composable, вызвать его в onClick нельзя. GlobalScope не отменится, runBlocking заблокирует главный поток.

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

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