Komponen tarik untuk memperbarui memungkinkan pengguna menarik ke bawah di awal konten aplikasi untuk memperbarui data.
Platform API
Gunakan composable PullToRefreshBox
untuk menerapkan tarik lalu muat ulang, yang
bertindak sebagai penampung untuk konten yang dapat di-scroll. Parameter utama berikut mengontrol perilaku dan tampilan pembaruan:
isRefreshing
: Nilai boolean yang menunjukkan apakah tindakan refresh sedang berlangsung.onRefresh
: Fungsi lambda yang dijalankan saat pengguna memulai refresh.indicator
: Menyesuaikan indikator yang digambar sistem pada tarik untuk memperbarui.
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
membungkusLazyColumn
, yang menampilkan daftar string.PullToRefreshBox
memerlukan parameterisRefreshing
danonRefresh
.- Konten dalam blok
PullToRefreshBox
merepresentasikan konten yang dapat di-scroll.
Hasil
Video ini menunjukkan implementasi tarik lalu muat ulang 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 tarik untuk memuat ulang 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 yang sepenuhnya kustom dalam implementasi tarik untuk memperbarui:
@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 pemicuan refresh. - Seperti pada cuplikan sebelumnya, contoh ini mengekstrak instance
PullToRefreshState
, sehingga Anda dapat meneruskan instance yang sama kePullToRefreshBox
danpullToRefreshModifier
. - Contoh ini menggunakan warna penampung dan nilai minimum posisi dari class
PullToRefreshDefaults
. Dengan begitu, Anda dapat menggunakan kembali perilaku dan gaya default dari library Material, sambil menyesuaikan hanya elemen yang Anda inginkan. MyCustomIndicator
menggunakanCrossfade
untuk bertransisi antara ikon cloud danCircularProgressIndicator
. Ikon cloud akan diperbesar saat pengguna menarik, dan bertransisi keCircularProgressIndicator
saat tindakan refresh dimulai.targetState
menggunakanisRefreshing
untuk menentukan status mana yang akan ditampilkan (ikon cloud atau indikator progres melingkar).animationSpec
menentukan animasitween
untuk transisi, dengan durasi yang ditentukan sebesarCROSSFADE_DURATION_MILLIS
.state.distanceFraction
menunjukkan seberapa jauh pengguna telah menarik ke bawah, mulai dari0f
(tidak ditarik) hingga1f
(ditarik sepenuhnya).- Pengubah
graphicsLayer
mengubah skala dan transparansi.
Hasil
Video ini menampilkan indikator kustom dari kode sebelumnya: