Функция repeatOnLifecycle
Функция repeatOnLifecycle extension для
Lifecycle
многократно запускает suspend-блок,
когда owner поднимается минимум до
заданного
State.
Чаще всего берут
Lifecycle.State.STARTED,
чтобы collect Flow только на видимом экране.
При опускании ниже порога блок отменяют.
Синтаксис
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
flow.collect { }
}
Параметры
| Параметр | Описание |
|---|---|
state |
Минимальный этап Lifecycle. Пока
currentState не ниже него,
блок активен.
|
block |
Suspend-лямда, которую выполняют на каждом входе в state. |
Пример
Давайте соберём Flow только в STARTED:
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 androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.flow.flow
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val owner = LocalLifecycleOwner.current
var text by remember { mutableStateOf("abcde") }
val stream = remember {
flow {
emit("abcde")
emit("12345")
}
}
LaunchedEffect(owner) {
owner.lifecycle.repeatOnLifecycle(
Lifecycle.State.STARTED,
) {
stream.collect { value ->
text = value
}
}
}
Text(text = text)
}
}
}
На экране текст дойдёт до "12345",
пока Lifecycle не ниже STARTED.
Пример
Давайте сменим порог на RESUMED:
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 androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.LocalLifecycleOwner
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.delay
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val owner = LocalLifecycleOwner.current
var text by remember { mutableStateOf("abcde") }
LaunchedEffect(owner) {
owner.lifecycle.repeatOnLifecycle(
Lifecycle.State.RESUMED,
) {
delay(300)
text = "12345"
}
}
Text(text = text)
}
}
}
На экране "12345" появится,
когда Activity в RESUMED.
Смотрите также
-
функция
collectAsStateWithLifecycle,
которая оборачивает collect для UI -
перечисление
State,
где задают порог STARTED или RESUMED -
функция
LaunchedEffect,
внутри которой вызывают repeatOnLifecycle -
класс
LocalLifecycleOwner,
откуда берут lifecycle в Compose