Mit der Komponente „Zum Aktualisieren ziehen“ können Nutzer am Anfang des Inhalts einer App nach unten ziehen, um die Daten zu aktualisieren.
API-Oberfläche
Verwenden Sie die PullToRefreshBox zusammensetzbare Funktion, um die Funktion „Zum Aktualisieren ziehen“ zu implementieren. Sie
dient als Container für scrollbare Inhalte. Die folgenden wichtigen Parameter steuern das Aktualisierungsverhalten und das Erscheinungsbild:
isRefreshing: Ein boolescher Wert, der angibt, ob die Aktualisierung ausgeführt wird.onRefresh: Eine Lambda-Funktion, die ausgeführt wird, wenn der Nutzer eine Aktualisierung startet.indicator: Passt die Anzeige an, die das System für die Funktion „Zum Aktualisieren ziehen“ zeichnet.
Einfaches Beispiel
Dieses Snippet zeigt die grundlegende Verwendung von 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) }) } } } }
Wichtige Informationen zum Code
PullToRefreshBoxumschließt eineLazyColumn, in der eine Liste von Strings angezeigt wird.PullToRefreshBoxerfordert die ParameterisRefreshingundonRefresh.- Der Inhalt im Block
PullToRefreshBoxstellt den scrollbaren Inhalt dar.
Ergebnis
Dieses Video zeigt die grundlegende Implementierung der Funktion „Zum Aktualisieren ziehen“ aus dem vorherigen Code:
Erweitertes Beispiel: Indikatorfarbe anpassen
@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) }) } } } }
Wichtige Informationen zum Code
- Die Indikatorfarbe wird über die Eigenschaften
containerColorundcolorim Parameterindicatorangepasst. rememberPullToRefreshState()verwaltet den Status der Aktualisierung. Sie verwenden diesen Status in Verbindung mit dem Parameterindicator.
Ergebnis
Dieses Video zeigt eine Implementierung der Funktion „Zum Aktualisieren ziehen“ mit einem farbigen Indikator:
Erweitertes Beispiel: Vollständig benutzerdefinierten Indikator erstellen
Sie können komplexe benutzerdefinierte Indikatoren erstellen, indem Sie vorhandene zusammensetzbare Funktionen und Animationen nutzen.Dieses Snippet zeigt, wie Sie einen vollständig benutzerdefinierten Indikator in Ihrer Implementierung der Funktion „Zum Aktualisieren ziehen“ erstellen:
@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 } ) } } } }
Wichtige Informationen zum Code
- Im vorherigen Snippet wurde der von der Bibliothek bereitgestellte
Indicatorverwendet. In diesem Snippet wird eine benutzerdefinierte zusammensetzbare Indikatorfunktion namensMyCustomIndicatorerstellt. In dieser zusammensetzbaren Funktion verarbeitet der ModifikatorpullToRefreshIndicatordie Positionierung und das Auslösen einer Aktualisierung. - Wie im vorherigen Snippet wird im Beispiel die
PullToRefreshState-Instanz extrahiert, sodass Sie dieselbe Instanz sowohl anPullToRefreshBoxals auch anpullToRefreshModifierübergeben können. - Im Beispiel werden die Containerfarbe und der Positionsschwellenwert aus der Klasse
PullToRefreshDefaultsverwendet. So können Sie das Standardverhalten und die Standardformatierung aus der Material-Bibliothek wiederverwenden und nur die Elemente anpassen, die Sie benötigen. MyCustomIndicatorverwendetCrossfade, um zwischen einem Cloud-Symbol und einemCircularProgressIndicatorzu wechseln. Das Cloud-Symbol wird größer, wenn der Nutzer zieht, und wechselt zu einemCircularProgressIndicator, wenn die Aktualisierung beginnt.targetStateverwendetisRefreshing, um zu bestimmen, welcher Status angezeigt werden soll (das Cloud-Symbol oder der kreisförmige Fortschrittsindikator).animationSpecdefiniert einetween-Animation für den Übergang mit einer angegebenen Dauer vonCROSSFADE_DURATION_MILLIS.state.distanceFractiongibt an, wie weit der Nutzer nach unten gezogen hat. Der Wert reicht von0f(kein Ziehen) bis1f(vollständig gezogen).- Der Modifikator
graphicsLayerändert die Skalierung und Transparenz.
Ergebnis
Dieses Video zeigt den benutzerdefinierten Indikator aus dem vorherigen Code: