В каких случаях перезапускается LaunchedEffect

Ответ

LaunchedEffect перезапускается в двух случаях:

  1. Изменение ключа (первого параметра). При изменении ключа предыдущий эффект отменяется и запускается новый:
LaunchedEffect(key) { // перезапустится при изменении key
    // эффект
}
  1. Изменение Composition. Если композиция перезапускается (например, при повороте экрана или изменении конфигурации), эффект также перезапускается.

Для предотвращения перезапуска используйте rememberUpdatedState или константные ключи. Если нужно выполнить эффект только один раз - передайте Unit или другую константу в качестве ключа.

Ответ 18+ 🔞

А, бля, ну это же про ЛаунчедЭффект в Композе! Слушай, тут история проще пареной репы, но если не врубиться — можно охуеть с этих перезапусков.

В общем, представь, что этот эффект — как какой-нибудь долбоёб, который начинает дело, но его легко отвлечь. Он перезапускается, то есть бросает всё и начинает заново, всего в двух случаях. Запоминай, а то потом будешь ебаться с багами.

Первый случай — это когда у него ключ меняется. Это как если ты дал ему команду «следи за этой дверью», а потом сказал «а теперь следи за той дверью». Он про первую сразу забудет, плюнет и начнёт смотреть на новую. В коде это вот так:

LaunchedEffect(key) { // вот эта херня (key) — это и есть тот самый ключ
    // какой-то эффект
}

Поменялся key — всё, старый эффект нахуй отменяется, и тут же стартует новый. Чистая правда.

Второй случай — это когда вся композиция пересобирается. Ну, типа, экран повернули, или конфигурация какая поменялась. Композ думает: «Ёпта, всё заново строим!» И этот твой эффект, как и всё остальное, накрывается медным тазом и запускается с чистого листа. Сам от такого охуеешь, когда анимация твоя дергается на каждом повороте.

Так как же не дать ему сходить с ума?

Ну, логично же, блядь. Если не хочешь перезапусков — не трогай ключ, пусть он будет константой. Самый частый костыль — это Unit запихнуть в качестве ключа. Типа «на, смотри на эту хуйню, она никогда не меняется, иди делай своё дело один раз и отъебись».

LaunchedEffect(Unit) { // Ключ — Unit, он всегда один и тот же, константа.
    // Этот эффект выполнится один раз при первом попадании в композицию
    // и не будет перезапускаться просто так.
}

Или rememberUpdatedState есть, хитрая жопа, но это уже для другого случая, когда тебе внутри эффекта нужно свежее значение какой-то переменной, но сам эффект перезапускать из-за её изменений не хочется.

Короче, суть в чём: ключ — это всё. Хочешь контролировать жизнь эффекта — контролируй ключ. Не хочешь, чтобы он дёргался — дай ему что-то вечное и неизменное. Всё просто, как три копейки. Главное — понять, а потом уже не наступать на эти грабли.