הגדרת סדרן עבודה

כדי להטמיע מערכת ניווט חזקה, האפליקציה צריכה דרך מרכזית לטפל במחוות חזרה ובאותות ניווט אחרים. בדף הזה מוסבר איך להשתמש ב-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()
    }
}

לאחר מכן, מעבירים את הקלט הזה למרכז הבקרה:

navigationEventDispatcher.addInput(MyInput())

מחיקת משאבים באמצעות dispose()

כדי למנוע דליפות זיכרון בממשק משתמש דינמי, צריך להסיר באופן מפורש כל מופע של NavigationEventDispatcher שנוצר מההיררכיה באמצעות השיטה dispose(), כשהרכיב שאליו הוא משויך מושמד:

navigationEventDispatcher.dispose()

השיטה dispose() מבטיחה ניקוי מדורג על ידי הסרה חוזרת של רכיב השליחה וכל הצאצאים שלו (ילדים ונכדים), וכך מבטיחה שכל רכיבי הטיפול המשויכים יבוטלו מהמערכת המשותפת.

היררכיה ושליטה של משגרים

ה-NavigationEventDispatcher תומך בהיררכיה של הורה-צאצא, ומאפשר לרכיבים שמוטמעים עמוק בממשק משתמש (כמו NavHost או תיבות דו-שיח מוטמעות) להשתתף בטיפול באירועי ניווט.

יצירת רכיב child dispatcher

שולח צאצא נוצר על ידי העברת הפניה לשולח ההורה שלו במהלך הבנייה. לכל רכיבי ה-dispatcher בהיררכיה יש אותו NavigationEventProcessor כדי לשמור על סדר גלובלי של אירועים לפי עדיפות בשיטת נכנס אחרון, יוצא ראשון (LIFO).

הפעלה היררכית

ה-dispatcher כולל מאפיין isEnabled שמאפשר למפתחים להפעיל או להשבית בבת אחת עץ משנה שלם של handlers.

כשמשביתים (isEnabled = false) משגר הורה, המערכת מתעלמת מכל אמצעי הטיפול שמשויכים לאותו הורה ולכל אחד מהצאצאים שלו, ללא קשר למצב ההפעלה האישי שלהם.