אפשר לספק מידע נוסף או להחיל את אותה לוגיקה על יעדים באמצעות המחלקה NavEntryDecorator. המחלקות האלה עוטפות כל NavEntry במחסנית חזרה עם פונקציה שניתנת להרכבה. במילים אחרות, הוא מעטר את התוכן של הרשומה.
יצירת דקורטור בהתאמה אישית
כדי ליצור דקורטור, מרחיבים את המחלקה NavEntryDecorator ומבטלים את השיטות הבאות:
-
decorate– פונקציית למבדה קומפוזבילית שמופעלת עבור כלNavEntryבמחסנית החזרה. היא מקבלת אתNavEntryכפרמטר. כך אפשר ליצור אובייקטים של מצב שמקבלים מפתח לפיcontentKeyשל הרשומה. אפשר להשתמש ב-CompositionLocalProviderכדי לספק תלויות בתוכן של הרשומה. אפשר גם להקיף את התוכן בפונקציה שאפשר להרכיב, או להפעיל תופעות לוואי. תמיד צריך להפעיל אתentry.Content()בתוך ה-method הזה. -
onPop– קריאה חוזרת (callback) שמופעלת כש-NavEntryהוסר מערימת החזרה ויצא מהקומפוזיציה. הוא מקבל אתcontentKeyשל הרשומה שהוסרה. משתמשים ב-contentKeyכדי לזהות ולנקות את כל המצב שמשויך לרשומה הזו.
בדוגמה הבאה מורחבת המחלקה NavEntryDecorator כדי ליצור דקורטור בהתאמה אישית.
// import androidx.navigation3.runtime.NavEntryDecorator class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>( decorate = { entry -> Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated") entry.Content() }, onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") } )
אם הדקורטור צריך גישה למצב, יוצרים פונקציה שניתנת להגדרה שיוצרת את המצב הזה, ואז משתמשים בה כדי ליצור את הדקורטור. דוגמה להטמעה מופיעה בקוד המקור של rememberSaveableStateHolderNavEntryDecorator. הפעולה הזו יוצרת את המצב – SaveableStateHolder – ומשתמשת בו כדי ליצור את ה-decorator.
עיצוב של ערימת הפעילויות הקודמות
אחרי שיוצרים את NavEntryDecorator, אפשר להוסיף קישוטים לרשומות במחסנית האחורית באחת משתי דרכים:
- שימוש ב-
rememberDecoratedNavEntries. הפונקציה הזו שימושית כשמשתמשים בכמה מחסניות חזרה, שלכל אחת מהן יש קבוצה משלה של מעצבים (פרטים נוספים זמינים במתכון הקוד הזה). הפונקציה מחזירה רשימה מעוצבת שלNavEntryשאפשר להשתמש בה עםNavDisplay. - מעבירים את ה-decorator ישירות אל
NavDisplayבאמצעות הפרמטרentryDecorators. NavDisplaycallsrememberDecoratedNavEntriesunder the hood and displays the decorated entries.
הכללת מעצב ברירת המחדל
Navigation 3 כולל מעצב ברירת מחדל בשם SaveableStateHolderNavEntryDecorator שמאפשר לשמור את הסטטוס של NavEntry גם אחרי שינויים בהגדרות וגם אחרי שהתהליך מסתיים. הוא עוטף את התוכן של NavEntry ב-SaveableStateProvider, וכך מאפשר לקריאות של rememberSaveable בתוך התוכן של NavEntry לפעול בצורה תקינה.
אלא אם המחלקה לקישוט מספקת SaveableStateProvider, צריך לכלול את SaveableStateHolderNavEntryDecorator כמחלקה הראשונה לקישוט ברשימה של המחלקות לקישוט שסופקו. הוא נוצר באמצעות
rememberSaveableStateHolderNavEntryDecorator.
לדוגמה:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
מתי כדאי להשתמש ב-decorator
אפשר להשתמש ב-decorator כדי:
- יוצרים תלות לכל
NavEntryבמחסנית הקודמת. לדוגמה, הפונקציהViewModelStoreNavEntryDecoratorיוצרתViewModelStoreלכלNavEntry. - הגדרת היקף של אובייקט למספר
NavEntry. לדוגמה, כדי לשתףViewModelבין כמה רשומות. - ביצוע אותה פעולה בכמה
NavEntry. לדוגמה, כדי לבצע פעולות של רישום ביומן, ניפוי באגים או מעקב עבור כל רשומה. - עוטפים את
NavEntrys באותה פונקציה הניתנת להגדרה. - ניקוי המצב שמשויך ל-
NavEntry. לדוגמה, כשערך מוסר ממחסנית החזרה,ViewModelStoreNavEntryDecoratorמנקה אתViewModelStoreהמשויך.
אין להשתמש ב-decorator כדי:
- העברת תלות ל-
NavEntryיחיד. - מספקים יחסי תלות שההיקף שלהם רחב יותר מ-back stack.
בשני המקרים האלה, מעבירים את התלות ישירות כשיוצרים את NavEntry
במקום זאת.
דוגמאות קוד נוספות זמינות במאמר NavEntryDecorator.