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