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 tarik untuk memuat ulang, yang
berfungsi sebagai penampung untuk konten yang dapat di-scroll. Parameter utama berikut
mengontrol perilaku dan tampilan pemuatan ulang:
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 memuat ulang.
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
PullToRefreshBoxmenggabungkanLazyColumn, yang menampilkan daftar string.PullToRefreshBoxmemerlukan parameterisRefreshingdanonRefresh.- Konten dalam blok
PullToRefreshBoxmewakili konten yang dapat di-scroll.
Hasil
Video ini menunjukkan implementasi dasar tarik untuk memuat ulang 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 menampilkan implementasi tarik untuk 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 tarik untuk memuat ulang:
@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( painter = rememberVectorPainter(AppIcons.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 dalam 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 cara ini, Anda dapat menggunakan kembali perilaku dan gaya default dari library Material, sekaligus hanya menyesuaikan elemen yang Anda minati. MyCustomIndicatormenggunakanCrossfadeuntuk bertransisi antara ikon cloud danCircularProgressIndicator. Ikon cloud akan membesar saat pengguna menarik, dan bertransisi keCircularProgressIndicatorsaat tindakan refresh dimulai.targetStatemenggunakanisRefreshinguntuk menentukan status 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: