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

Функция PullToRefreshBox

Функция PullToRefreshBox из Material3 оборачивает прокручиваемое содержимое и реагирует на жест «потянуть вниз». Пока идёт загрузка, параметр isRefreshing должен быть true, иначе индикатор скроется. Когда пользователь дотянул до порога, вызывают лямбду onRefresh, где обычно запускают загрузку данных. Внутри кладут, например, LazyColumn.

Синтаксис

PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = { isRefreshing = true }, ) { LazyColumn { /* content */ } }

Параметры

Параметр Описание
isRefreshing true, пока идёт обновление и виден индикатор.
onRefresh Лямбда без параметров. Её вызывают, когда пользователь завершил жест обновления.
content Прокручиваемое содержимое под индикатором.

Пример

Давайте обновим список по жесту pull-to-refresh:

import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.pulltorefresh.PullToRefreshBox import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @OptIn(ExperimentalMaterial3Api::class) class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { var isRefreshing by remember { mutableStateOf(false) } var lines by remember { mutableStateOf(listOf("abcde")) } PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = { isRefreshing = true lines = listOf("abcde", "12345") isRefreshing = false }, ) { LazyColumn { items(lines) { line -> Text(text = line) } } } } } }

На экране сначала одна строка "abcde", после жеста обновления в списке появится и "12345".

Пример

Давайте сбросим флаг обновления из корутины после задержки:

import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text import androidx.compose.material3.pulltorefresh.PullToRefreshBox 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 @OptIn(ExperimentalMaterial3Api::class) class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { var isRefreshing by remember { mutableStateOf(false) } if (isRefreshing) { LaunchedEffect(Unit) { delay(1000) isRefreshing = false } } PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = { isRefreshing = true }, ) { LazyColumn { item { Text(text = "abcde") } item { Text(text = "12345") } } } } } }

На экране индикатор обновления исчезнет через секунду после жеста, список останется на месте.

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

  • функция LazyColumn,
    которую часто кладут внутрь PullToRefreshBox
  • метод verticalScroll,
    который прокручивает Column без ленивого списка
  • функция CircularProgressIndicator,
    которую иногда показывают при загрузке
  • функция LazyRow,
    которую тоже можно обернуть для обновления
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить