Yenilemek için kaydırma bileşeni, kullanıcıların verileri yenilemek için uygulama içeriğinin başından aşağı doğru sürüklemesine olanak tanır.
API yüzeyi
Kaydırılabilir içeriğiniz için kapsayıcı görevi gören yenilemek için kaydırma özelliğini uygulamak üzere PullToRefreshBox composable'ı kullanın. Aşağıdaki anahtar parametreler, yenileme davranışını ve görünümünü kontrol eder:
isRefreshing: Yenileme işleminin devam edip etmediğini belirten bir Boole değeri.onRefresh: Kullanıcı yenileme işlemi başlattığında yürütülen bir lambda işlevi.indicator: Sistemin yenilemek için kaydırma işleminde çizdiği göstergeyi özelleştirir.
Temel örnek
Bu snippet, PullToRefreshBox öğesinin temel kullanımını gösterir:
@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) }) } } } }
Kodla ilgili önemli noktalar
PullToRefreshBox, dize listesi gösteren birLazyColumnsarmalar.PullToRefreshBoxiçinisRefreshingveonRefreshparametreleri gerekir.PullToRefreshBoxbloğundaki içerik, kaydırılabilir içeriği temsil eder.
Sonuç
Bu videoda, önceki koddan temel yenilemek için kaydırma uygulaması gösterilmektedir:
Gelişmiş örnek: Gösterge rengini özelleştirme
@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) }) } } } }
Kodla ilgili önemli noktalar
- Gösterge rengi,
indicatorparametresindekicontainerColorvecolorözellikleri aracılığıyla özelleştirilir. rememberPullToRefreshState(), yenileme işleminin durumunu yönetir. Bu durumuindicatorparametresiyle birlikte kullanırsınız.
Sonuç
Bu videoda, renkli bir göstergeyle yenilemek için kaydırma uygulamasının nasıl çalıştığı gösterilmektedir:
Gelişmiş örnek: Tamamen özelleştirilmiş bir gösterge oluşturma
Mevcut bileşenlerden ve animasyonlardan yararlanarak karmaşık özel göstergeler oluşturabilirsiniz.Bu snippet'te, yenilemek için kaydırma uygulamanızda tamamen özel bir göstergenin nasıl oluşturulacağı gösterilmektedir:
@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 } ) } } } }
Kodla ilgili önemli noktalar
- Önceki snippet, kitaplık tarafından sağlanan
Indicatoröğesini kullanıyordu. Bu snippet,MyCustomIndicatoradlı özel bir composable gösterge oluşturur. Bu composable'dapullToRefreshIndicatordeğiştiricisi, konumlandırmayı ve yenilemeyi tetiklemeyi yönetir. - Önceki snippet'te olduğu gibi, örnekte
PullToRefreshStateörneği ayıklanır. Böylece aynı örneği hemPullToRefreshBoxhem depullToRefreshModifier'ye iletebilirsiniz. - Örnekte,
PullToRefreshDefaultssınıfındaki kapsayıcı rengi ve konum eşiği kullanılmıştır. Bu sayede, yalnızca ilgilendiğiniz öğeleri özelleştirirken Material kitaplığındaki varsayılan davranışı ve stili yeniden kullanabilirsiniz. MyCustomIndicator, bulut simgesi ileCircularProgressIndicatorarasında geçiş yapmak içinCrossfadekullanır. Kullanıcı aşağı çektiğinde bulut simgesi büyür ve yenileme işlemi başladığındaCircularProgressIndicatorsimgesine dönüşür.targetState, hangi durumun (bulut simgesi veya dairesel ilerleme durumu göstergesi) gösterileceğini belirlemek içinisRefreshingkullanır.animationSpec, geçiş içinCROSSFADE_DURATION_MILLISsüreli birtweenanimasyonu tanımlar.state.distanceFraction, kullanıcının ne kadar aşağı çektiğini gösterir.0f(çekme yok) ile1f(tamamen çekilmiş) arasında değişir.graphicsLayerdeğiştiricisi, ölçeği ve şeffaflığı değiştirir.
Sonuç
Bu videoda, önceki kodda yer alan özel gösterge gösterilmektedir: