पुल-टू-रीफ़्रेश कॉम्पोनेंट की मदद से, उपयोगकर्ता किसी ऐप्लिकेशन के कॉन्टेंट को रीफ़्रेश करने के लिए, उसे नीचे की ओर खींच सकते हैं.
एपीआई सरफ़ेस
पुल-टू-रीफ़्रेश की सुविधा लागू करने के लिए, 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मॉडिफ़ायर, स्केल और पारदर्शिता में बदलाव करता है.
नतीजा
इस वीडियो में, ऊपर दिए गए कोड से बना कस्टम इंडिकेटर दिखाया गया है: