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