אפשר לספק מידע נוסף או להחיל את אותה לוגיקה על יעדים באמצעות המחלקה NavEntryDecorator. המחלקות האלה עוטפות כל NavEntry במקבץ פעילויות קודמות (back stack) עם פונקציה קומפוזבילית. במילים אחרות, הוא מעטר את התוכן של הרשומה.
יצירת מעצב בהתאמה אישית
כדי ליצור דקורטור, מרחיבים את המחלקה NavEntryDecorator ומבטלים את השיטות הבאות:
decorate– פונקציית lambda קומפוזבילית שמופעלת עבור כלNavEntryבמקבץ פעילויות קודמות (back stack). היא מקבלת אתNavEntryכפרמטר. כך אפשר ליצור אובייקטים של מצב שמקושרים לערך שלcontentKeyשל הרשומה. אפשר להשתמש ב-CompositionLocalProviderכדי לספק תלויות לתוכן של הרשומה. אפשר גם להקיף את התוכן בפונקציה קומפוזבילית, או להפעיל תופעות לוואי. תמיד צריך להפעיל אתentry.Content()בתוך ה-method הזה.-
onPop– קריאה חוזרת (callback) שמופעלת כש-NavEntryהוסר ממקבץ הפעילויות הקודמות (back stack) ויצא מהקומפוזיציה. הוא מקבל את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, אפשר להוסיף עיצוב לרשומות במקבץ פעילויות קודמות (back stack) באחת משתי דרכים:
- שימוש ב-
rememberDecoratedNavEntries. הפונקציה הזו שימושית כשמשתמשים בכמה מחסניות של פעולות קודמות, שלכל אחת מהן יש קבוצה משלה של מעצבים (פרטים נוספים זמינים במתכון הקוד הזה). הפונקציה מחזירה רשימה מעוצבת שלNavEntryשאפשר להשתמש בה עםNavDisplay. - מעבירים את ה-decorator ישירות אל
NavDisplayבאמצעות הפרמטרentryDecorators. NavDisplaycallsrememberDecoratedNavEntriesמתבצעת מתחת לפני השטח, והערכים המעוטרים מוצגים.
הכללת מעצב ברירת המחדל
Navigation 3 כולל מעצב ברירת מחדל בשם SaveableStateHolderNavEntryDecorator שמאפשר לשמור את הסטטוס של NavEntry גם אחרי שינויים בהגדרות וגם אחרי שהתהליך מסתיים. הוא עוטף את התוכן של NavEntry ב-SaveableStateProvider, וכך מאפשר לקריאות של rememberSaveable בתוך התוכן של NavEntry לפעול בצורה תקינה.
אלא אם המחלקה לקישוט מספקת SaveableStateProvider, צריך לכלול את SaveableStateHolderNavEntryDecorator כמחלקה הראשונה לקישוט ברשימה של המחלקות לקישוט שסופקו. הוא נוצר באמצעות
rememberSaveableStateHolderNavEntryDecorator.
לדוגמה:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
העברת תוצאות באמצעות ResultEventBusNavEntryDecorator
החל מגרסה 3 1.2.0 של Navigation, אפשר להשתמש ב-ResultEventBusNavEntryDecorator כדי לספק ResultEventBus לכל NavEntry באמצעות LocalResultEventBus composition local.
כברירת מחדל, rememberResultEventBusNavEntryDecorator יוצר וזוכר מופע ResultEventBus משלו באופן פנימי באמצעות rememberResultEventBus. אם אתם צריכים לגשת ל-event bus מחוץ להיררכיית ה-decorator (למשל, בפיגום של האפליקציה ברמה העליונה), אתם יכולים להעביר את ResultEventBus על ידי קריאה ל-rememberResultEventBus והעברה שלו ל-rememberResultEventBusNavEntryDecorator(resultEventBus):
val resultEventBus = rememberResultEventBus() NavDisplay( /* ... */ entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus) ) )
פרטים נוספים על שליחת תוצאות וצפייה בהן זמינים במאמר בנושא החזרת תוצאות.
מתי כדאי להשתמש ב-decorator
אפשר להשתמש ב-decorator כדי:
- יוצרים תלות לכל
NavEntryבמקבץ פעילויות קודמות (back stack). לדוגמה, הפונקציהViewModelStoreNavEntryDecoratorיוצרתViewModelStoreלכלNavEntry. - העברת תוצאות ותקשורת בין יעדים. לדוגמה,
ResultEventBusNavEntryDecoratorמספקResultEventBusליעדים במקבץ פעילויות קודמות (back stack). - הגדרת היקף של אובייקט לכמה
NavEntry. לדוגמה, כדי לשתףViewModelבין כמה רשומות. - ביצוע אותה פעולה בכמה
NavEntry. לדוגמה, כדי לבצע פעולות של רישום ביומן, ניפוי באגים או מעקב עבור כל רשומה. - עוטפים את
NavEntrys באותה פונקציה קומפוזבילית. - ניקוי המצב שמשויך ל-
NavEntry. לדוגמה, כשערך מוסר ממקבץ הפעילויות הקודמות (back stack),ViewModelStoreNavEntryDecoratorמנקה אתViewModelStoreהמשויך.
אין להשתמש ב-Decorator כדי:
- העברת תלות ל-
NavEntryיחיד. - מספקים יחסי תלות שההיקף שלהם רחב יותר מזה של מקבץ פעילויות קודמות (back stack).
בשני המקרים האלה, צריך להעביר את התלות ישירות כשיוצרים את NavEntry
במקום זאת.
דוגמאות קוד נוספות זמינות במאמר NavEntryDecorator.