Функция 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