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

Функция 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
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить