Функция LaunchedEffect
Функция LaunchedEffect входит в composable
и запускает suspend-код в scope composable.
Когда ключи в параметрах меняются,
старая корутина отменяется и стартует новая.
Когда composable уходит с экрана,
корутина тоже отменяется.
Так обновляют состояние после задержки
или подписываются на поток один раз.
Синтаксис
LaunchedEffect(key1) {
delay(1000)
}
Параметры
| Параметр | Описание |
|---|---|
keys |
Ключи эффекта. При смене любого ключа корутина перезапускается. |
block |
Suspend-лямда с телом эффекта. |
Пример
Давайте сменим текст через секунду после старта:
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.material3.Text
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var text by remember { mutableStateOf("abcde") }
LaunchedEffect(Unit) {
delay(1000)
text = "12345"
}
Text(text = text)
}
}
}
На экране сначала будет "abcde",
через секунду текст сменится на "12345".
Пример
Давайте перезапустим эффект при смене ключа:
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.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
var key by remember { mutableIntStateOf(0) }
var text by remember { mutableStateOf("abcde") }
LaunchedEffect(key) {
text = "abcde"
delay(500)
text = "12345"
}
Button(onClick = { key++ }) {
Text(text = "abcde")
}
Text(text = text)
}
}
}
На экране каждое нажатие снова покажет
"abcde", затем через паузу "12345".
Смотрите также
-
функция
DisposableEffect,
которая вызывает onDispose при уходе -
функция
SideEffect,
которая срабатывает после каждой удачной перерисовки -
функция
repeatOnLifecycle,
которая привязывает корутину к Lifecycle -
функция
produceState,
которая пишет в State из корутины