הרכיב "למשוך למטה לרענון" מאפשר למשתמשים לגרור את המסך כלפי מטה בתחילת התוכן של האפליקציה כדי לרענן את הנתונים.
פלטפורמת ה-API
משתמשים ברכיב ה-Composable 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) }) } } } }
מידע חשוב על הקוד
- צבע האינדיקטור מותאם אישית באמצעות המאפיינים
containerColorו-colorבפרמטרindicator. -
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. בפונקציה הקומפוזבילית הזו, ה-modifierpullToRefreshIndicatorמטפל במיקום ובהפעלת הרענון. - כמו בקטע הקוד, בדוגמה הזו מחלצים את המכונה
PullToRefreshState, כדי שתוכלו להעביר את אותה מכונה גם ל-PullToRefreshBoxוגם ל-pullToRefreshModifier. - בדוגמה נעשה שימוש בצבע של הקונטיינר ובסף המיקום מהמחלקה
PullToRefreshDefaults. כך אפשר להשתמש שוב בפעולת ברירת המחדל ובסגנון מספריית Material, ולהתאים אישית רק את הרכיבים שמעניינים אתכם. -
MyCustomIndicatorמשתמש ב-Crossfadeכדי לעבור בין סמל ענן לביןCircularProgressIndicator. סמל הענן גדל כשהמשתמש מושך, ומשתנה לCircularProgressIndicatorכשפעולת הרענון מתחילה.- הפונקציה
targetStateמשתמשת ב-isRefreshingכדי לקבוע איזה מצב להציג (סמל הענן או אינדיקטור ההתקדמות המעגלי). animationSpecמגדיר אנימציה שלtweenלמעבר, עם משך זמן מוגדר שלCROSSFADE_DURATION_MILLIS.-
state.distanceFractionמייצג את המרחק שהמשתמש משך למטה, בטווח שבין0f(ללא משיכה) ל-1f(משיכה מלאה). - המשתנה
graphicsLayerמשנה את קנה המידה והשקיפות.
- הפונקציה
תוצאה
בסרטון הזה מוצג האינדיקטור בהתאמה אישית מהקוד הקודם: