'खींचकर रीफ़्रेश करें' कॉम्पोनेंट की मदद से, उपयोगकर्ता ऐप्लिकेशन के कॉन्टेंट की शुरुआत में, नीचे की ओर खींचकर डेटा को रीफ़्रेश कर सकते हैं.
एपीआई का प्लैटफ़ॉर्म
पुल-टू-रिफ़्रेश सुविधा लागू करने के लिए, PullToRefreshBox
कॉम्पोज़ेबल का इस्तेमाल करें. यह आपके स्क्रोल किए जा सकने वाले कॉन्टेंट के लिए कंटेनर के तौर पर काम करता है. रीफ़्रेश करने के तरीके और दिखने के तरीके को ये मुख्य पैरामीटर कंट्रोल करते हैं:
isRefreshing
: यह एक बूलियन वैल्यू है, जिससे पता चलता है कि फ़िलहाल रीफ़्रेश करने की कार्रवाई की जा रही है या नहीं.onRefresh
: एक ऐसा LAMBDA फ़ंक्शन जो उपयोगकर्ता के रीफ़्रेश करने पर चालू होता है.indicator
: पुल-टू-रिफ़्रेश पर दिखने वाले इंडिकेटर को पसंद के मुताबिक बनाता है.
बुनियादी उदाहरण
इस स्निपेट में, 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) }) } } } }
कोड के बारे में अहम जानकारी
PullToRefreshBox
,LazyColumn
को रैप करता है, जो स्ट्रिंग की सूची दिखाता है.PullToRefreshBox
के लिएisRefreshing
औरonRefresh
पैरामीटर ज़रूरी हैं.PullToRefreshBox
ब्लॉक में मौजूद कॉन्टेंट, स्क्रोल किए जा सकने वाले कॉन्टेंट को दिखाता है.
नतीजा
इस वीडियो में, ऊपर दिए गए कोड से, पुल-टू-रिफ़्रेश की बुनियादी सुविधा को लागू करने का तरीका बताया गया है:
बेहतर उदाहरण: इंडिकेटर का रंग पसंद के मुताबिक बनाना
@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) }) } } } }
कोड के बारे में अहम जानकारी
- इंडिकेटर के कलर को
indicator
पैरामीटर मेंcontainerColor
औरcolor
प्रॉपर्टी की मदद से पसंद के मुताबिक बनाया जा सकता है. rememberPullToRefreshState()
, रीफ़्रेश ऐक्शन की स्थिति को मैनेज करता है. इस स्टेटस का इस्तेमाल,indicator
पैरामीटर के साथ किया जाता है.
नतीजा
इस वीडियो में, रंगीन इंडिकेटर के साथ पुल-टू-रिफ़्रेश की सुविधा को लागू करने का तरीका बताया गया है:
बेहतर उदाहरण: पूरी तरह से पसंद के मुताबिक इंडिकेटर बनाना
मौजूदा कॉम्पोज़ेबल और ऐनिमेशन का इस्तेमाल करके, जटिल कस्टम इंडिकेटर बनाए जा सकते हैं.इस स्निपेट में, पुल-टू-रिफ़्रेश लागू करने के दौरान, पूरी तरह से कस्टम इंडिकेटर बनाने का तरीका बताया गया है:
@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 } ) } } } }
कोड के बारे में अहम जानकारी
- पिछले स्निपेट में, लाइब्रेरी से मिले
Indicator
का इस्तेमाल किया गया था. यह स्निपेट,MyCustomIndicator
नाम का कस्टम इंडिकेटर कॉम्पोज़ेबल बनाता है. इस कॉम्पोज़ेबल में,pullToRefreshIndicator
मॉडिफ़ायर, पोज़िशनिंग और रीफ़्रेश को ट्रिगर करता है. - पिछले स्निपेट की तरह ही,
PullToRefreshState
इंस्टेंस को बाहर निकाला गया है, ताकि एक ही इंस्टेंस कोPullToRefreshBox
औरpullToRefreshModifier
, दोनों को पास किया जा सके. - कंटेनर के रंग और पोज़िशन थ्रेशोल्ड का इस्तेमाल,
PullToRefreshDefaults
क्लास से किया जाता है. इस तरह, Material लाइब्रेरी के डिफ़ॉल्ट व्यवहार और स्टाइल का फिर से इस्तेमाल किया जा सकता है. साथ ही, सिर्फ़ अपनी पसंद के एलिमेंट को पसंद के मुताबिक बनाया जा सकता है. MyCustomIndicator
, क्लाउड आइकॉन औरCircularProgressIndicator
के बीच ट्रांज़िशन करने के लिए,Crossfade
का इस्तेमाल करता है. जब उपयोगकर्ता खींचता है, तो क्लाउड आइकॉन का साइज़ बढ़ जाता है. साथ ही, रीफ़्रेश ऐक्शन शुरू होने पर, यहCircularProgressIndicator
में बदल जाता है.targetState
,isRefreshing
का इस्तेमाल करके यह तय करता है कि कौनसी स्थिति दिखानी है (क्लाउड आइकॉन या गतिविधि की स्थिति सर्कुलर फ़ॉर्मैट में दिखाने वाला इंडिकेटर).animationSpec
, ट्रांज़िशन के लिएtween
ऐनिमेशन तय करता है. इसमेंCROSSFADE_DURATION_MILLIS
की तय अवधि होती है.state.distanceFraction
से पता चलता है कि उपयोगकर्ता ने पेज को कितना नीचे खींचा है. यह वैल्यू0f
(पेज को नहीं खींचा गया) से लेकर1f
(पेज को पूरी तरह खींचा गया) तक हो सकती है.graphicsLayer
मॉडिफ़ायर, स्केल और पारदर्शिता में बदलाव करता है.
नतीजा
इस वीडियो में, ऊपर दिए गए कोड का कस्टम इंडिकेटर दिखाया गया है: