Komponen tarik untuk memuat ulang memungkinkan pengguna menarik ke bawah di awal konten aplikasi untuk memuat ulang data.
Platform API
Gunakan composable PullToRefreshBox
untuk menerapkan pull-to-refresh, yang
bertindak sebagai penampung untuk konten yang dapat di-scroll. Parameter utama berikut
mengontrol perilaku dan tampilan refresh:
isRefreshing
: Nilai boolean yang menunjukkan apakah tindakan refresh saat ini sedang berlangsung.onRefresh
: Fungsi lambda yang dieksekusi saat pengguna memulai refresh.indicator
: Menyesuaikan indikator yang digambar pada pull-to-refresh.
Contoh dasar
Cuplikan ini menunjukkan penggunaan dasar PullToRefreshBox
:
@Composable fun PullToRefreshBasicSample( items: List<String>, isRefreshing: Boolean, onRefresh: () -> Unit, modifier: Modifier = Modifier ) { PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = onRefresh, modifier = modifier ) { LazyColumn(Modifier.fillMaxSize()) { items(items) { ListItem({ Text(text = it) }) } } } }
Poin penting tentang kode
PullToRefreshBox
menggabungkanLazyColumn
, yang menampilkan daftar string.PullToRefreshBox
memerlukan parameterisRefreshing
danonRefresh
.- Konten dalam blok
PullToRefreshBox
mewakili konten yang dapat di-scroll.
Hasil
Video ini menunjukkan implementasi pull-to-refresh dasar dari kode sebelumnya:
Contoh lanjutan: Menyesuaikan warna indikator
@Composable fun PullToRefreshCustomStyleSample( items: List<String>, isRefreshing: Boolean, onRefresh: () -> Unit, modifier: Modifier = Modifier ) { val state = rememberPullToRefreshState() PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = onRefresh, modifier = modifier, state = state, indicator = { Indicator( modifier = Modifier.align(Alignment.TopCenter), isRefreshing = isRefreshing, containerColor = MaterialTheme.colorScheme.primaryContainer, color = MaterialTheme.colorScheme.onPrimaryContainer, state = state ) }, ) { LazyColumn(Modifier.fillMaxSize()) { items(items) { ListItem({ Text(text = it) }) } } } }
Poin penting tentang kode
- Warna indikator disesuaikan melalui properti
containerColor
dancolor
dalam parameterindicator
. rememberPullToRefreshState()
mengelola status tindakan refresh. Anda menggunakan status ini bersama dengan parameterindicator
.
Hasil
Video ini menunjukkan implementasi pull-to-refresh dengan indikator berwarna:
Contoh lanjutan: Membuat indikator yang sepenuhnya disesuaikan
Anda dapat membuat indikator kustom yang kompleks dengan memanfaatkan composable dan animasi yang ada.Cuplikan ini menunjukkan cara membuat indikator kustom sepenuhnya dalam implementasi pull-to-refresh:
@Composable fun PullToRefreshCustomIndicatorSample( items: List<String>, isRefreshing: Boolean, onRefresh: () -> Unit, modifier: Modifier = Modifier ) { val state = rememberPullToRefreshState() PullToRefreshBox( isRefreshing = isRefreshing, onRefresh = onRefresh, modifier = modifier, state = state, indicator = { MyCustomIndicator( state = state, isRefreshing = isRefreshing, modifier = Modifier.align(Alignment.TopCenter) ) } ) { LazyColumn(Modifier.fillMaxSize()) { items(items) { ListItem({ Text(text = it) }) } } } } // ... @Composable fun MyCustomIndicator( state: PullToRefreshState, isRefreshing: Boolean, modifier: Modifier = Modifier, ) { Box( modifier = modifier.pullToRefreshIndicator( state = state, isRefreshing = isRefreshing, containerColor = PullToRefreshDefaults.containerColor, threshold = PositionalThreshold ), contentAlignment = Alignment.Center ) { Crossfade( targetState = isRefreshing, animationSpec = tween(durationMillis = CROSSFADE_DURATION_MILLIS), modifier = Modifier.align(Alignment.Center) ) { refreshing -> if (refreshing) { CircularProgressIndicator(Modifier.size(SPINNER_SIZE)) } else { val distanceFraction = { state.distanceFraction.coerceIn(0f, 1f) } Icon( imageVector = Icons.Filled.CloudDownload, contentDescription = "Refresh", modifier = Modifier .size(18.dp) .graphicsLayer { val progress = distanceFraction() this.alpha = progress this.scaleX = progress this.scaleY = progress } ) } } } }
Poin penting tentang kode
- Cuplikan sebelumnya menggunakan
Indicator
yang disediakan oleh library. Cuplikan ini membuat composable indikator kustom yang disebutMyCustomIndicator
. Dalam composable ini, pengubahpullToRefreshIndicator
menangani pemosisian dan memicu refresh. - Seperti pada cuplikan sebelumnya, instance
PullToRefreshState
telah diekstrak, sehingga instance yang sama dapat diteruskan kePullToRefreshBox
danpullToRefreshModifier
. - Warna penampung dan nilai minimum posisi digunakan dari
class
PullToRefreshDefaults
. Dengan cara ini, Anda dapat menggunakan kembali perilaku dan gaya default dari library Material, sekaligus menyesuaikan hanya elemen yang Anda minati. MyCustomIndicator
menggunakanCrossfade
untuk bertransisi antara ikon cloud danCircularProgressIndicator
. Ikon cloud diskalakan saat pengguna menarik, dan bertransisi keCircularProgressIndicator
saat tindakan refresh dimulai.targetState
menggunakanisRefreshing
untuk menentukan status yang akan ditampilkan (ikon cloud atau indikator progres melingkar).animationSpec
menentukan animasitween
untuk transisi, dengan durasiCROSSFADE_DURATION_MILLIS
yang ditentukan.state.distanceFraction
menunjukkan seberapa jauh pengguna telah menarik ke bawah, mulai dari0f
(tidak menarik) hingga1f
(ditarik sepenuhnya).- Pengubah
graphicsLayer
mengubah skala dan transparansi.
Hasil
Video ini menampilkan indikator kustom dari kode sebelumnya: