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
PullToRefreshBoxmembungkusLazyColumn, yang menampilkan daftar string.PullToRefreshBoxmemerlukan parameterisRefreshingdanonRefresh.- Konten dalam blok
PullToRefreshBoxmerepresentasikan 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
containerColordancolordalam parameterindicator. rememberPullToRefreshState()mengelola status tindakan refresh. Anda menggunakan status ini bersama dengan parameterindicator.
Hasil
Video ini menunjukkan penerapan 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.pullToRefresh( state = state, isRefreshing = isRefreshing, threshold = PositionalThreshold, onRefresh = { } ), 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
Indicatoryang disediakan oleh library. Cuplikan ini membuat composable indikator kustom yang disebutMyCustomIndicator. Dalam composable ini, pengubahpullToRefreshIndicatormenangani pemosisian dan pemicuan refresh. - Seperti pada cuplikan sebelumnya, contoh ini mengekstrak instance
PullToRefreshState, sehingga Anda dapat meneruskan instance yang sama kePullToRefreshBoxdanpullToRefreshModifier. - 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, sekaligus menyesuaikan elemen yang Anda inginkan. MyCustomIndicatormenggunakanCrossfadeuntuk bertransisi antara ikon cloud danCircularProgressIndicator. Ikon cloud akan diperbesar saat pengguna menarik, dan bertransisi keCircularProgressIndicatorsaat tindakan refresh dimulai.targetStatemenggunakanisRefreshinguntuk menentukan status mana yang akan ditampilkan (ikon cloud atau indikator progres melingkar).animationSpecmenentukan animasitweenuntuk transisi, dengan durasi yang ditentukan sebesarCROSSFADE_DURATION_MILLIS.state.distanceFractionmenunjukkan seberapa jauh pengguna telah menarik ke bawah, mulai dari0f(tidak ditarik) hingga1f(ditarik sepenuhnya).- Pengubah
graphicsLayermengubah skala dan transparansi.
Hasil
Video ini menampilkan indikator kustom dari kode sebelumnya: