Compose · 2 / 3

Эффекты: ключи и актуальные значения

Когда перезапускать работу, а когда только обновить 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.

К вопросам →