Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
323 of 502 menu
◀ ▶

Функция DisposableEffect

Функция DisposableEffect запускает лямбду, когда composable впервые попал в дерево с данным набором ключей. Лямбда должна вернуть объект DisposableEffectResult с методом onDispose. При смене ключей или уходе composable сначала вызовут onDispose, затем снова выполнят основную лямбду. Так подписываются на Lifecycle или освобождают ресурсы.

Синтаксис

DisposableEffect(key1) { onDispose { } }

Параметры

Параметр Описание
keys Ключи эффекта. Смена ключа снимает старый эффект и ставит новый.
effect Лямбда, которая возвращает onDispose { }.

Пример

Давайте сменим текст при монтировании и сбросим при уходе:

import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { var show by remember { mutableStateOf(true) } if (show) { Panel(onLeave = { show = false }) } else { Text(text = "abcde") } Button(onClick = { show = !show }) { Text(text = "12345") } } } } @androidx.compose.runtime.Composable private fun Panel(onLeave: () -> Unit) { var text by remember { mutableStateOf("abcde") } DisposableEffect(Unit) { text = "12345" onDispose { onLeave() } } Text(text = text) }

На экране при показе Panel текст станет "12345", при скрытии Panel сработает onDispose.

Пример

Давайте повесим наблюдателя на LifecycleOwner:

import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.Text import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleEventObserver import androidx.lifecycle.compose.LocalLifecycleOwner class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val owner = LocalLifecycleOwner.current var text by remember { mutableStateOf("abcde") } DisposableEffect(owner) { val observer = LifecycleEventObserver { _, event -> if (event == Lifecycle.Event.ON_RESUME) { text = "12345" } } owner.lifecycle.addObserver(observer) onDispose { owner.lifecycle.removeObserver(observer) } } Text(text = text) } } }

На экране после ON_RESUME текст сменится на "12345", при уходе observer снимут.

Смотрите также

  • функция LaunchedEffect,
    которая запускает suspend-код
  • метод addObserver,
    который вешает observer на Lifecycle
  • класс LocalLifecycleOwner,
    откуда берут владельца цикла
  • функция SideEffect,
    которая не имеет onDispose
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить