Эффекты: ключи и актуальные значения
Когда перезапускать работу, а когда только обновить callback
Эффект принадлежит месту в композиции
Вызов сетевого запроса из тела composable может повториться при рекомпозиции или произойти в композиции, которая не будет применена. Выбирайте API по сроку жизни действия. LaunchedEffect(key) запускает корутину и отменяет её при смене ключа или уходе из композиции. Эффекты Compose.
Ключ — причина перезапуска
@Composable
fun Notice(id: String, onTimeout: () -> Unit) {
val latestTimeout by rememberUpdatedState(onTimeout)
LaunchedEffect(id) {
delay(1_000)
latestTimeout()
}
}
Здесь новый id начинает новый таймер. Обновление callback не сбрасывает таймер, но по завершении вызывается актуальная функция. Фрагмент использует Compose Runtime и kotlinx.coroutines.delay. LaunchedEffect(Unit) не означает «один раз за жизнь приложения»: повторный вход в композицию запускает его заново. Эффекты Compose.
Ресурсы и успешное применение
DisposableEffect(owner) подходит для регистрации слушателя и парного удаления в onDispose. SideEffect публикует состояние внешнему объекту после успешного применения композиции; он не предназначен для однократного сетевого запроса. Эффекты Compose.
rememberCoroutineScope удобен для действия по нажатию, если работа должна отмениться вместе с composable. Долговечная отправка заказа требует владельца вне временного UI.
Наблюдайте состояние без вечного перезапуска
snapshotFlow наблюдает чтения snapshot-state внутри своего блока. Если эффект с коллекцией ключевать тем же меняющимся query, вы будете постоянно пересоздавать наблюдение. Выбирайте ключ владельца потока, а query наблюдайте внутри. Это следствие модели ключей, а не правило «всегда ставить Unit».
Основа отбора: draft/compose_base.md, draft/M++.md.