כדי להטמיע מערכת ניווט חזקה, האפליקציה צריכה דרך מרכזית לטפל בתנועות חזרה ובאותות ניווט אחרים. בדף הזה מוסבר איך להשתמש ב-NavigationEventDispatcher כדי לתאם ולהפיץ את אירועי הניווט האלה באפליקציה.
הצהרה על NavigationEventDispatcher
NavigationEventDispatcher הוא הרכיב המרכזי בספרייה NavigationEvent. הוא פועל כמרכז אירועים ששולח אירועים שקשורים לניווט, כמו תנועות חזרה ומעברי ניווט, למאזינים רשומים באפליקציה. רכיבים יכולים להירשם לאירועים האלה כדי להגיב לשינויים בניווט או לפעולות ניווט אחרות שמופעלות על ידי המערכת.
צריך לספק NavigationEventDispatcher מופעים באמצעות NavigationEventDispatcherOwner. כך חלקים שונים של האפליקציה יכולים לגשת לאותו משגר ולצפות באירועי ניווט באופן עקבי ומתואם.
class MyComponent: NavigationEventDispatcherOwner { override val navigationEventDispatcher: NavigationEventDispatcher = NavigationEventDispatcher() }
אם אתם בתוך ComponentActivity, במקום להטמיע משגר משלכם, אתם יכולים לאחזר את המשגר שסופק לכם.
class MyCustomActivity : ComponentActivity() { fun addMyHandler() { // navigationEventDispatcher provided by the ComponentActivity navigationEventDispatcher.addHandler(myNavigationEventHandler) } }
הוספה של NavigationEventInput
אחרי שרשמתם את ה-handler, אתם מוכנים לקבל אירועים.
עם זאת, צריך לספק מקור שממנו נוצרים האירועים באמצעות NavigationEventInput.
NavigationEventInput הוא הרכיב הספציפי לפלטפורמה שמקבל קלט מערכת גולמי ומתרגם אותו ל-NavigationEvent סטנדרטי שנשלח אל NavigationEventDispatcher.
הדוגמה הבאה היא הטמעה בהתאמה אישית של NavigationEventInput:
public class MyInput : NavigationEventInput() { @MainThread public fun backStarted(event: NavigationEvent) { dispatchOnBackStarted(event) } @MainThread public fun backProgressed(event: NavigationEvent) { dispatchOnBackProgressed(event) } @MainThread public fun backCancelled() { dispatchOnBackCancelled() } @MainThread public fun backCompleted() { dispatchOnBackCompleted() } }
בשלב הבא, מספקים את הקלט הזה ל-dispatcher:
navigationEventDispatcher.addInput(MyInput())
פינוי מקום במשאבים באמצעות dispose()
כדי למנוע דליפות זיכרון בממשק משתמש דינמי, צריך להסיר באופן מפורש כל מופע של NavigationEventDispatcher מההיררכיה באמצעות השיטה dispose() כשהרכיב שאליו הוא קשור נהרס:
navigationEventDispatcher.dispose()
השיטה dispose() מבטיחה ניקוי מדורג על ידי הסרה חוזרת של ה-dispatcher וכל הצאצאים שלו (ילדים ונכדים), וכך מבטיחה שכל ה-handlers המשויכים יוסרו מהמערכת המשותפת.
היררכיה ושליטה של מוקדנים
ה-NavigationEventDispatcher תומך בהיררכיית הורה-צאצא, שמאפשרת לרכיבים שמוטמעים עמוק בתוך ממשק המשתמש (כמו NavHost או תיבות דו-שיח מוטמעות) להשתתף בטיפול באירועי ניווט.
יצירת דיספצ'ר צאצא
כדי ליצור משגר צאצא, צריך להעביר הפניה למשגר ההורה שלו במהלך הבנייה. כל הדיספצ'רים בהיררכיה משתפים את אותו NavigationEventProcessor כדי לשמור על סדר אירועים גלובלי של Last-In, First-Out (LIFO) על סמך עדיפות.
הפעלה היררכית
המשגר כולל מאפיין isEnabled שמאפשר למפתחים להפעיל או להשבית עץ משנה שלם של handlers בבת אחת.
כשמבטלים את ההפעלה של מנהל ראשי (isEnabled = false), המערכת מתעלמת מכל ה-handlers שמשויכים למנהל הראשי הזה ולכל אחד מהמנהלים המשניים שלו, בלי קשר למצב ההפעלה של כל אחד מהם.