navigationevent

  
ספריית Navigation Event מספקת API שמתמקד ב-KMP לטיפול בחזרה למערכת וגם בחיזוי של תנועת החזרה.
העדכון האחרון גרסה יציבה גרסה מועמדת להפצה גרסת בטא גרסת אלפא
‫28 בינואר 2026 1.0.2 - - -

הצהרה על יחסי תלות

כדי להוסיף תלות ב-navigationevent, צריך להוסיף את מאגר Google Maven לפרויקט. מידע נוסף זמין במאמר בנושא מאגר Maven של Google.

אתם יכולים להוסיף את יחסי התלות של הארטיפקטים שאתם צריכים בקובץ build.gradle של האפליקציה או המודול:

גרוב

dependencies {
    implementation "androidx.navigationevent:navigationevent:1.0.2"
}

Kotlin

dependencies {
    implementation("androidx.navigationevent:navigationevent:1.0.2")
}

מידע נוסף זמין במאמר הוספת יחסי תלות ב-build.

משוב

המשוב שלכם עוזר לנו לשפר את Jetpack. נשמח לדעת אם גיליתם בעיות חדשות או אם יש לכם רעיונות איך לשפר את הספרייה הזו. כדאי לעיין בבעיות הידועות בספרייה הזו לפני שמדווחים על בעיה. כדי להוסיף הצבעה בדיווח על בעיה קיימת, לוחצים על כפתור הכוכב.

יצירת דיווח על בעיה חדשה

מידע נוסף זמין במאמרי העזרה בנושא Issue Tracker.

אין הערות לגבי הגרסה של הארטיפקט הזה.

גירסה 1.0

גרסה 1.0.2

‫28 בינואר 2026

androidx.navigationevent:navigationevent-*:1.0.2 מופץ. גרסה 1.0.2 מכילה את השמירות האלה.

תיקוני באגים

  • תוקנה קריסה שמתרחשת כשמשתמשים ב-NavigationEventHandler בתצוגות המקדימות של Android Studio. ה-handler מזהה עכשיו את מצב הבדיקה ולא עושה כלום, וכך מאפשר להציג את התצוגה המקדימה בלי שסופק dispatcher. (I370f2, ‏ b/454313986).

גרסה 1.0.1

‫3 בדצמבר 2025

androidx.navigationevent:navigationevent-*:1.0.1 מופץ. גרסה 1.0.1 מכילה את השמירות האלה.

תיקוני באגים

  • תוקן באג ConcurrentModificationException כשמסירים צאצא NavigationEventDispatcher כמו אלה שנוצרו באמצעות rememberNavigationEventDispatcherOwner(). (ec68a9, b/454363524)

גרסה 1.0.0

‫19 בנובמבר 2025

androidx.navigationevent:navigationevent-*:1.0.0 מופץ. גרסה 1.0.0 מכילה את השמירות האלה.

התכונות העיקריות של גרסה 1.0.0:

הספרייה Navigation Event יציבה עכשיו. ‫Navigation Event היא ספריית AndroidX לטיפול באינטראקציות ברמת המערכת, כמו חזרה אחורה במערכת וחזרה אחורה עם חיזוי ב-Android (ובפלטפורמות אחרות).

  • כדי לטפל בNavigationEvent, אפשר להטמיע NavigationEventHandler משלכם שמבטל את הפונקציות הרצויות. לאחר מכן, צריך להוסיף את ה-handler ל-NavigationEventDispatcher. החל מגרסת Activity 1.12.0, ‏ ComponentActivity מטמיע את הממשק החדש NavigationEventDispatcherOwner, שמספק רכיב לשליחת נתונים שמוכן לשימוש :

    // The NavigationEventInfo provides information about a navigation state
    object CurrentInfo : NavigationEventInfo()
    
    // you can retrieve this from any component that is a NavigationEventDispatcherOwner
    // or you can instantiate your own custom dispatcher
    val dispatcher = myActivity.navigationEventDispatcher
    
    val myHandler = object : NavigationEventHandler<NavigationEventInfo>(
                initialInfo = CurrentInfo,
                isBackEnabled = true
            ) {
                override fun onBackStarted(event: NavigationEvent) {
                    // Prepare for the back event
                }
    
                override fun onBackProgressed(event: NavigationEvent) {
                    // Use event.progress for predictive animations
                }
    
                // This is the required method for final event handling
                override fun onBackCompleted() {
                    // Complete the back event
                }
    
                override fun onBackCancelled() {
                    // Cancel the back event
                }
            }
    
    dispatcher.addHandler(myHandler)
    
  • מודול navigationevent:navigationevent-compose מספק פונקציית יצירה נוחה NavigationBackHandler שמקשרת באופן אוטומטי את ה-handler ל-LocalNavigationEventDispatcherOwner הקרוב ביותר NavigationEventDispatcher ומאפשרת למפתחים לספק את ההתנהגות הרצויה כפרמטרים:

    object CurrentInfo : NavigationEventInfo()
    object PreviousInfo : NavigationEventInfo()
    
    val navEventState = rememberNavigationEventState(
      currentInfo = CurrentInfo,
      backInfo = PreviousInfo
    )
    
    // Inside composition
    NavigationBackHandler(
        State = navEventState,
        isBackEnabled = true,
        // optional
        onBackCancelled = { // Cancel the back event },
        // required
        onBackCompleted = { // Complete the back event } ,
    )
    

השימוש בדפוס הזה ב-Compose מאפשר להעביר בקלות את NavigationEventState למעלה ולאפשר צפייה בו על ידי רכיבים שניתנים להרכבה שונים (כלומר, במקרה של Navigation3, אפשר להעביר את המצב למעלה מתוך NavDisplay).

  • לכל NavigationEventDispatcher יש אפשרות לספק משגר ראשי, גם במקרים של יצירת הודעה וגם במקרים אחרים. כך המפתחים יכולים ליצור מבנה היררכי שבו אפשר לנהל כמה רכיבי Dispatcher באמצעות רכיב הורה יחיד. אם יש לכם קבוצת אב, קל יחסית לטפל בקבוצות של שולחי בקשות שאולי צריך להשבית או להסיר:

    // Non-Compose
    val parentDispatcher = NavigationEventDispatcher()
    val childDispatcher = NavigationEventDispatcher(parent = parentDispatcher)
    
    // Compose
    val composeChildDispatcher = rememberNavigationEventDispatcher(
        // This defaults to `LocalNavigationEventDispatcherOwner.current`
        // Must explicitly provide null to have an unparented dispatcher created here
        parent = NavigationEventDispatch() 
    )
    
  • הספרייה גם מאפשרת לספק אותות ישירות ל-NavigationEventDispatcher באמצעות NavigationEventInput. ‫NavigationEventInputs פועל כצד ה'קלט' של מערכת הניווט, ומתרגם אירועים ספציפיים לפלטפורמה (כמו מחוות חזרה במערכת או לחיצות על לחצנים) לאירועים סטנדרטיים שאפשר לשלוח אל NavigationEventDispatcher. מודול navigationevent:navigationevent מספק כרגע 2 NavigationEventInput: ‏DirectNavigationEventInput כללי יותר שמאפשר שליחה של כל אירוע, ו-OnBackInvokedInput ספציפי ל-Android שמאפשר ל-NavigationEventDispatcher לתמוך בחזרה למערכת ובמחוות חזרה עם חיזוי. אם אתם מטמיעים מפזר משלכם (במקום להשתמש במפזר שמסופק על ידי ComponentActivity), אתם צריכים להוסיף את הקלט באופן ידני:

    val dispatcher = NavigationEventDispatcher()
    
    dispatcher.addInput(DirectNavigationEventInput())
    dispatcher.addInput(OnBackInvokedDefaultInput(invoker))
    

גרסה ‎1.0.0-rc01

‫5 בנובמבר 2025

androidx.navigationevent:navigationevent-*:1.0.0-rc01 מופץ. גרסה ‎1.0.0-rc01 מכילה את השמירות האלה.

גרסה ‎1.0.0-beta01

‫8 באוקטובר 2025

androidx.navigationevent:navigationevent-*:1.0.0-beta01 מופץ. גרסה ‎1.0.0-beta01 מכילה את השמירות האלה.

שינויים ב-API

  • צריך לתקן את ההערה FloatRange ב-NavigationEvent.touchX וב-NavigationEvent.touchY. הערכים האלה מייצגים קואורדינטות פיקסלים מוחלטות ואין להם 1.0 גבול עליון. ‫(I4b205, ‏ b/445989313)
  • משנים את השם של הרכיב הקומפוזבילי NavigationEventDispatcherOwner ל-rememberNavigationEventDispatcherOwner. הפונקציה מחזירה עכשיו את NavigationEventDispatcherOwner ישירות. כדי לספק את הבעלים הזה לקומפוזיציה משנית, משתמשים ב-CompositionLocalProvider. ‫(I874b2, ‏ b/444446629)

גרסה ‎1.0.0-alpha09

‫24 בספטמבר 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha09 מופץ. גרסה ‎1.0.0-alpha09 מכילה את השמירות האלה.

שינויים ב-API

  • במקום ליצור מופע של Idle(), אפשר להשתמש ישירות באובייקט הסינגלטון NavigationEventTransitionState.Idle. (Ic7d9e, ‏ b/444734264)
  • הופכים את בנאי הנוחות ל-internal; מקבלים מופעים באמצעות NavigationEventDispatcher.history ציבורי במקום בנייה ישירה. (I3b7e0, ‏ b/444734264)
  • נדרש ליצור את NavigationEventState באמצעות rememberNavigationEventState. ה-constructor הוא עכשיו פנימי. (Ie143c, b/444734264)
  • להשתמש ב-onBackCompletedFallback במקום ב-fallbackOnBackPressed ובפרמטר של בנאי. ההתנהגות לא משתנה. הפעולה מופעלת רק באירועי חזרה לאחור שהושלמו ולא טופלו. (Idabe9, ‏ b/444734264)
  • הבונה הראשי של NavigationEventHistory(mergedHistory, currentIndex) הוא עכשיו internal. צרכנים חיצוניים צריכים להשתמש ב-constructors ציבוריים (או ב-constructor ריק או ב-constructor מבוסס-מחיצות) כדי ליצור מופעים. (I1c047, ‏ b/444734264)
  • Make View.setViewTreeNavigationEventDispatcherOwner accept nullable owner (Ic9eb6, b/444436762)
  • המינוי של NavigationEventInfo הוא עכשיו abstract class במקום interface. מעדכנים את כל ההטמעות בהתאמה אישית כך שיורשות מהמחלקה (לדוגמה, data class MyInfo : NavigationEventInfo()). (I1e59c, ‏ b/444734264)
  • המאפיין NavigationEventDispatcher.state והפונקציה getState<T>() מדור קודם הוסרו. משתמשים בתהליכי העבודה החדשים והנפרדים של dispatcher.transitionState (לגבי התקדמות בתנועה) ושל dispatcher.history (לגבי מחסנית הניווט). ‫(Ic2ceb, ‏ b/444734264)
  • ההחזרה של NavigationEventInput.onInfoChanged(...) מוחלפת. מטמיעים את הקריאה החוזרת (callback) החדשה onHistoryChanged(history: NavigationEventHistory) כדי לקבל עדכונים כאובייקט NavigationEventHistory יחיד. (I23e0b, ‏ b/444734264)
  • השקת NavigationEventDispatcher.history StateFlow גלובלי חדש. התהליך הזה לא גנרי, והוא מאפשר לצופים להירשם רק לשינויים במערך הניווט. הוא נשאר יציב במהלך התקדמות המחוות. זהו המקבילה של transitionState. (I1db10, ‏ b/444734264)
  • השקת NavigationEventDispatcher.transitionState StateFlow גלובלי חדש. התהליך הזה לא גנרי, והוא מאפשר לצופים להירשם רק למצב הפיזי של התנועה (Idle/InProgress), בנפרד מההיסטוריה. (I171fa, ‏ b/444734264)
  • להציג את הכיתה NavigationEventHistoryState. ה-API הזה ישמש כ-API הליבה לצפייה בהיסטוריה של פרטי הניווט, בנפרד ממצב התנועה. (I81ca5, b/444734264)
  • NavigationEvent מסומן עכשיו כ-@Immutable, וכך מאפשר ל-Compose Compiler לבצע אופטימיזציה של הרכבות מחדש. (If78c7, b/444734264)
  • ממשקי ה-API של navigationevent-compose handler עודכנו. ‫NavigationEventHandler ו-NavigationBackHandler (וגרסאות שונות) תומכים עכשיו בעומס יתר חדש שמקבל NavigationEventStates שהועברו. העומסים הפשוטים (שמקבלים currentInfo) נשמרים ועכשיו משתמשים במודל המצב החדש הזה באופן פנימי. (Ic3251, b/444734264)
  • מוסיפים את מחזיק המצב החדש @Stable NavigationEventState<T> לספריית navigationevent-compose. האובייקט הזה משלב היסטוריה מקומית עם מצב תנועה מקומי, והוא יהיה הקישור העיקרי בין rememberNavigationEventState לבין NavigationEventHandler. (Ifb69f, b/444734264)
  • הוספת מאפיין חדש של transitionState: TransitionState לקריאה בלבד ל-NavigationEventHandler. מעכשיו, רכיבי ה-handler שומרים על מצב המעבר שלהם, ומערכות חיצוניות יכולות לעקוב אחריו. ‫(I9acd2, ‏ b/444734264)
  • הצגת המחלקה החדשה TransitionState sealed. ה-API הזה ישמש כ-API הליבה לצפייה במצב המחוות, בנפרד מהיסטוריית הניווט. (Id4beb, b/444734264)
  • המאפיינים currentInfo,‏ backInfo ו-forwardInfo מוצגים כמאפיינים ציבוריים לקריאה בלבד ב-NavigationEventHandler. ‫(Ia7636, ‏ b/444734264)
  • הטמעות של NavigationEventHandler חייבות עכשיו לספק ערך initialInfo: T לבנאי הבסיסי. (Idcfea, ‏ b/444734264)
  • מחליפים את OnBackInvokedInput ב-OnBackInvokedOverlayInput או ב-OnBackInvokedDefaultInput. (I5323f, ‏ b/428948766)
  • סימון של NavigationEventState כ@Immutable. הפעולה הזו משפרת את הביצועים של Compose, כי היא מאפשרת לרכיבי Composables שמתבססים על המצב הזה לדלג על יצירה מחדש בצורה נכונה. (I399c8)
  • משנים את השם של NavigationEventInfo.NotProvided ל-NavigationEventInfo.None; כדי לעדכן את ההפניות. אין שינוי בהתנהגות. (I5e2d4)
  • NavigationEventInfo מסומן עכשיו כ-@Immutable, וכך מאפשר ל-Compose Compiler לבצע אופטימיזציה של הרכבות מחדש. (I7c112)
  • שיפור הארגונומיה של Java עם ממשק מהנה לגיבוי של השלמה לאחור. (I8a860)
  • שינוי השם של onHasEnabledHandlerChanged לonHasEnabledHandlersChanged. ההסבר הזה מבהיר שהקריאה החוזרת מדווחת על מצב ההפעלה המשותף של כל רכיבי ה-handler, ולא רק על אחד מהם. (I1af61, ‏ b/443711297)
  • הסרת hasEnabledHandler() מ-NavigationEventDispatcher; ושימוש ב-NavigationEventInput.onHasEnabledHandlersChanged במקום. (Idef72, ‏ b/443711297)
  • מוסיפים onInfoChanged callback ל-NavigationEventInput כדי להודיע למאזינים על שינויים בהיסטוריית הניווט. כך אפשר לקבל את ההקשר המלא של הערימות הנוכחיות, הקודמות והבאות, ולשנות את הקלט בהתאם למידע ההקשרי. (I69a8b, b/443282983)
  • Make NavigationEvent's swipeEdge an @IntDef (Icee54, b/443950342)
  • מוסיפים פרמטר priority ל-NavigationEventDispatcher.addInput כדי להגדיר את ההיקף של מארגן התורים לעדיפות אחת. אירועים כמו onHasEnabledCallbacksChanged מופעלים עכשיו רק כשמתבצע שינוי בקריאות החוזרות בעדיפות הזו. (I3e488, ‏ b/443711297)
  • לשנות את השם של הפרמטר NavigationEventDispatcher מ-parentDispatcher ל-parent כדי שיהיה ברור יותר. (Id4f1f, ‏ b/443801782)
  • הסרת NavigationEventPriority לטובת @IntDef למשתמשי Java‏ (I10a9f, ‏ b/440514265)
  • אכיפת חוזה של רכיב לטיפול בניווט. אם NavigationEventHandler מגדיר את isBackEnabled או את isForwardEnabled לערך true, עכשיו צריך לבטל את ההגדרה של onBackCompleted או של onForwardCompleted בהתאמה. ההטמעות שמוגדרות כברירת מחדל זורקות עכשיו חריג כדי למנוע כשלים שקטים. (I17c62)
  • הקפדה על ערכי עדיפות תקינים כשמוסיפים handlers של אירועי ניווט. התקשרות אל addHandler עם עדיפות לא נתמכת תגרום עכשיו להצגת IllegalArgumentException, ותספק משוב מיידי לגבי שימוש לא נכון בכל פלטפורמות היעד. (I3c474)

תיקוני באגים

  • להפוך את הפעולה לaddHandler אידמפוטנטית ולהתעלם מרישומים כפולים. ‫(I052aa, ‏ b/444734264)
  • שמירה על סנכרון של מאפייני NavigationEventState במהלך הרכבה מחדש. (Ib3b4d, ‏ b/444734264)
  • חשוב לוודא שNavigationEventInputs מקבלים את המידע ההקשרי העדכני (נוכחי, קודם, הבא) מיד לאחר ההרשמה. (Ie65bf, ‏ b/443282983)

גרסה ‎1.0.0-alpha08

‫10 בספטמבר 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha08 מופץ. גרסה ‎1.0.0-alpha08 מכילה את השמירות האלה.

תכונות חדשות

  • הוספנו API מבוסס-lambda‏ NavigationEventHandler שמחליף את ה-handler מבוסס-הזרימה. אפשר לטפל בתנועות החלקה קדימה ואחורה באמצעות קריאות חוזרות פשוטות במקום לאסוף נתונים, וכך לצמצם את כמות הקוד הסטנדרטי ולמנוע בעיות שקשורות לביטול. הוספנו את NavigationBackHandler ו-NavigationForwardHandler כממשקי API נוחים וממוקדים. מסירים את NavigationEventHandler שמבוסס על Flow ועוברים ל-callbacks החדשים. ‫(I23bac, ‏ b/436248277)
  • מאפשרת למאזינים פסיביים לגשת לכל היסטוריית הניווט באמצעות מידע משולב על חזרה. מאפשרת לממשקי משתמש להציג תצוגות מקדימות והיסטוריית ניווט מוטמעת במקום להיות מוגבלים לקריאה החוזרת העליונה ביותר. ‫(I7a510, ‏ b/436248277)
  • הוספת מודל ברור של חזרה, נוכחי וקדימה כדי להבהיר את מצב הניווט ולתמוך בניווט קדימה באמצעות רכיבי handler מוטמעים. (Ib86da, b/420443609)
  • הוספה של methods מסוג onForward* ו-isForwardEnabled ל-NavigationEventCallback. (Ic100f, ‏ b/436248290)
  • הוספת תמיכה בניווט קדימה ל-NavigationEventInput. (I5734b)

שינויים ב-API

  • הפעלת בדיקה של אירועי ניווט קדימה באמצעות TestNavigationEventCallback. משתמשים ב-isForwardEnabled וב-onForward*. ‫(I21fb5, ‏ b/420443609)
  • שינוי השם של onEvent* ל-onBack* ב-NavEvent. ‫(I228b3, ‏ b/436248290)
  • המרת SwipeEdge לכיתה מוטמעת. (Id5e01)
  • הופכים את הספרייה navigationevent לניתנת להפעלה הדדית עם Java. עכשיו יש גישה מלאה לכל ממשקי ה-API הציבוריים מקוד Java, כך שאפשר לשלב אותם בצורה חלקה בפרויקטים שכוללים שפות שונות או רק Java. (Ibc944,I5465f, I9fb1e, b/440532890b/443040294)
  • הבהרה של תפקידי API על ידי שינוי השם של NavigationEventCallback לNavigationEventHandler. השינוי הזה משקף טוב יותר את המטרה של המחלקה, שהיא טיפול במחוות ניווט מרובות שלבים. השיטה המתאימה addCallback היא עכשיו addHandler. (I2492a, b/443040331)

תיקוני באגים

  • למנוע את ההפעלה של חזרה לגרסה קודמת בניווט קדימה. (I74814, ‏ b/436248290)
  • הוספנו תמיכה בניווט קדימה חיזוי. NavigationEvent ממשקי ה-API מטפלים עכשיו בתנועות חזרה ובתנועות קדימה, ומאפשרים אנימציות עקביות לשני כיווני הניווט. (Idc98c, ‏ b/436248290)
  • למנוע קריסה של IllegalStateException במהלך הרכבה מחדש כשמסירים רכיב צאצא NavigationEventDispatcherOwner. (Iff50c, ‏ b/412629020)
  • מאזינים פסיביים יכולים עכשיו לגשת לכל היסטוריית הניווט באמצעות מידע משולב על חזרה, וכך ממשקי משתמש יכולים להציג תצוגות מקדימות והיסטוריית ניווט מוטמעת במקום להיות מוגבלים לקריאה החוזרת העליונה ביותר. ‫(I7a510, ‏ b/436248277)

גרסה ‎1.0.0-alpha07

‫27 באוגוסט 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha07 מופץ. גרסה ‎1.0.0-alpha07 מכילה את השמירות האלה.

שינויים ב-API

  • הסרה של NavigationEventDispatcher.onHasEnabledCallbacksChanged. (I50e97)
  • הפיכת NavigationEventCallback.onEventCompleted() למופשט. (I36b38)
  • שינוי שיטות NavigationEventCallback#on* לשיטות protected. מעדכנים את קוד החיוג כדי לשנות את ההגדרות. (I6b691)
  • שינוי השם של פונקציות DirectNavigationEventInput. (Iffb62)
  • שינוי השם של NavigationEventInput.onAttach לonAdded. (I2d0b8)
  • שינוי השם של NavigationEventInput.onDetach לonRemoved. (I2d0b8)
  • שינוי השם של NavigationEventInputHandler לNavigationEventInput. (I676a4)
  • הוספה של @EmptySuper אל NavigationEventInput.onHasEnabledCallbacksChanged. (If9853)
  • מטמיעים את onAttach ב-NavigationEventInputHandler. (I03648)
  • מטמיעים את onDetach ב-NavigationEventInputHandler. (I03648)
  • ברירת המחדל של NavigationEventCallback היא מופעלת בזמן היצירה. (Ic0188)
  • החלפת NavigationEventInput.addOnHasEnabledCallbacksChangedCallback ב-NavigationEventInput.onHasEnabledCallbacksChanged. (I64e93)
  • נדרש ה-thread הראשי למשך NavigationEventDispatcher.addInput. (Ic2930)
  • נדרש ה-thread הראשי למשך NavigationEventDispatcher.removeInput. (Ic2930)
  • הסרה של Dispatcher.addOnHasEnabledCallbacksChangedCallback. החלפה ב-Dispatcher.onHasEnabledCallbacksChanged. (Ida3e3, b/436530096)

תיקוני באגים

  • תוקן באג שבו הוספה של handler שכבר צורף או הסרה של handler שלא צורף הפעילו לוגיקה שגויה של מחזור החיים. (I9e47b)

גרסה ‎1.0.0-alpha06

‫13 באוגוסט 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha06 מופץ. גרסה ‎1.0.0-alpha06 מכילה את השמירות האלה.

תכונות חדשות

Passive Listeners API

עכשיו אפשר להעביר מידע הקשרי מותאם אישית מכל מארח ניווט ולהאזין באופן פסיבי לשינויים במצב המחוות מכל מקום בממשק המשתמש. ההגדרה הזו מפעילה אנימציות מבוססות-הקשר לחיזוי של תנועת החזרה ולניווט אחר שמבוסס על תנועות.

התכונה הזו כוללת שני חלקים:

  1. העברת מידע – שימוש ב-NavigationEventInfo להעברת נתונים מותאמים אישית.
  2. מצב צריכה – משתמשים ב-dispatcher.state (NavigationEventState) כדי לראות את ההתקדמות של תנועת היד ואת ההקשר.
  • NavigationEventCallback עכשיו חושף את השיטה setInfo(currentInfo, previousInfo) להגדרת הקשר של תנועת המגע בשיחה אחת (I1d5e7, ‏ b/424470518).
  • NavigationEventHandler מוסיף עומס יתר חדש שמקבל currentInfo ו-previousInfo, מה שהופך אותו ל-API הראשי לאספקת הקשר באפליקציות Compose‏ (I6ecd3, ‏ b/424470518).

דוגמה:

  data class MyScreenInfo(val screenName: String) : NavigationEventInfo

  NavigationEventHandler(
      enabled = true,
      currentInfo = MyScreenInfo("Details Screen"),
      previousInfo = MyScreenInfo("Home Screen")
  ) { /* Handle back completion */ }
  • NavigationEventDispatcher חושף עכשיו את dispatcher.state ואת dispatcher.getState<T>() (If7fae, ‏ Ia90ca, ‏ b/424470518). ממשקי ה-API האלה שמבוססים על StateFlow מאפשרים לכל ממשק משתמש לעקוב אחרי התקדמות של תנועות ונתונים הקשריים בלי לטפל באירוע ישירות.

דוגמה:

  val gestureState by LocalNavigationEventDispatcherOwner.current!!
      .navigationEventDispatcher
      .state
      .collectAsState()

  val progress = gestureState.progress // Returns latestEvent.progress or 0F

  when (val state = gestureState) {
      is InProgress -> {
          val toScreen = state.currentInfo as MyScreenInfo
          val fromScreen = state.previousInfo as MyScreenInfo
          println("Navigating from ${fromScreen.screenName} to ${toScreen.screenName}")
      }
      is Idle -> { /* Idle state */ }
  }
  • הוספת המאפיין progress אל NavigationEventState (I7b196) שמחזיר latestEvent.progress אם הפעולה מתבצעת, או 0F בכל מקרה אחר:

    val progress = state.progress
    
  • מוסיפים NavigationEventDispatcherOwner composable כדי ליצור, לקשר ולסלק מופעים של NavigationEventDispatcher באופן היררכי. הפעלה של שליטה דינמית במצב המופעל של רכיב השליחה וניקוי אוטומטי.

    @Composable
    fun Sample() {
        NavigationEventDispatcherOwner(enabled = true) {
            val localDispatcherOwner = LocalNavigationEventDispatcherOwner.current
        }
    }
    

שינויים ב-API

  • הפרמטר isPassthrough הוסר מ-NavigationEventCallback. (I99028, ‏ b/424470518)
  • הקונסטרוקטורים NavigationEventState הם עכשיו פנימיים. לצורך בדיקה, מעדכנים את הסטטוס (ברירת המחדל היא Idle) באמצעות DirectNavigationEventInputHandler. מתקשרים אל handleOnStarted או אל handleOnProgressed כדי להגדיר את המצב ל-InProgress, ואל handleOnCompleted או אל handleOnCancelled כדי להחזיר אותו ל-Idle. כדי לעדכן את NavigationEventInfo, צריך להשתמש בNavigationEventCallback.setInfo. (I93dca, b/424470518)
  • נוספו פרמטרים שמוגדרים כברירת מחדל ל-NavigationEvent כדי להקל על יצירת מופעים ולפשט את הבדיקות. צריך להשתמש בהם במקום ב-TestNavigationEvent. (I5dc49, I232f4)
  • נוסף TestNavigationEventCallback לבדיקת אירועי ניווט עם מצבים ספציפיים נוכחיים או קודמים. ‫(Idd22e, ‏ b/424470518)
  • NavigationEventInputHandler הפך למחלקה מופשטת כדי להחליף את AbstractNavigationEventInputHandler הקודם בהטמעה ב-DirectNavigationEventInputHandler (Iadde5, ‏ Ifed40I3897c, ‏b/432616296, ‏b/435416924)
  • הקידומות של הפונקציות send* ב-NavigationEventInputHandler שונו ל-handle*. (Iffcaf)
  • OnBackInvokedInputHandler מרחיב עכשיו את abstract החדש NavigationInputHandler. (Ib45aa)
  • השתנה NavigationEventDispatcherOwner כך שנדרש מפיץ ראשי שבו צריך להעביר במפורש את null כדי ליצור מפיץ ראשי. (Ia6f64, ‏ b/431534103)

תיקוני באגים

  • שיפרנו את היעילות על ידי מניעת העתקה של קולקציות ב-NavigationEventDispatcher.dispose(). (I4ab09)
  • תוקנה בעיה שבה NavigationEventHandler לא הגיב כראוי לשינויים במצב המופעל שלו. (Ia5268,I19bec, I5be5c, b/431534103)

עדכונים ב-Docs

  • המסמכים של KDocs עבור NavigationEvent הורחבו כדי להבהיר את התפקיד שלו כעטיפת אירועים מאוחדת ואת התנהגות מאפייני הפרטים בסוגי ניווט שונים (מחוות, קליקים). (I91e8d)
  • עדכנו את המסמכים בנושא ה-API של Compose לטיפול בהחזרת המערכת (BackHandler, PredictiveBackHandler, NavigationEventHandler) כדי להסביר את ההתנהגות באופן ספציפי לגבי סדר ההתקשרות חזרה. (I7ab94, )

עדכון תלות

  • NavigationEvent תלוי עכשיו ב-Compose Runtime 1.9.0-beta03, שמאפשר לארטיפקט navigationevent-compose לתמוך בכל יעדי KMP. (Ia1b87)

גרסה ‎1.0.0-alpha05

‫30 ביולי 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha05 מופץ. גרסה ‎1.0.0-alpha05 מכילה את השמירות האלה.

תמיכה בהיררכיה של הורה-ילד:

ל-NavigationEventDispatcher יכולים להיות עכשיו רכיבי Dispatcher הורה וצאצא, שיוצרים מבנה עץ היררכי. כך אירועי הניווט יכולים להתפשט ולנוהל בצורה גמישה יותר ברכיבי ממשק משתמש מורכבים של Compose, על ידי שיקוף ההיררכיה המבנית של ממשק המשתמש באמצעות משגרים משורשרים. (I194ac)

  // Create a parent dispatcher that will manage navigation events at a higher level.
  val parentDispatcher = NavigationEventDispatcher()

  // Create a child dispatcher linked to the parent, forming a hierarchy.
  val childDispatcher = NavigationEventDispatcher(parentDispatcher)

נכס isEnabled היררכי מאפשר שליטה במפיץ מלמעלה למטה. כשמגדירים את isEnabled לערך false במרכז בקרה, כל מרכזי הבקרה שנגזרים ממנו מושבתים אוטומטית. התכונה הזו מאפשרת להשבית ביעילות ענפים שלמים של מערכת אירועי הניווט. (I9e985)

  // Disabling the child dispatcher disables all its callbacks and any of its children recursively.
  childDispatcher.isEnabled = false

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

  // Create a test callback and add it to the child dispatcher.
  val callback1 = TestNavigationEventCallback(isEnabled = true)
  childDispatcher.addCallback(callback1)

  // Since the childDispatcher is disabled, the callback is effectively disabled as well.
  assertThat(callback1.isEnabled).isFalse()

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

  // Dispose the child dispatcher to clean up resources.
  childDispatcher.dispose()

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

  val callback2 = TestNavigationEventCallback()

  // Attempting to use a disposed dispatcher will throw an exception.
  assertThrows<IllegalStateException> {
      childDispatcher.addCallback(callback2)
  }

הערה: אנחנו נציג NavigationEventDispatcherOwner Composable חדש שמנהל באופן אוטומטי dispatcher צאצא בממשק המשתמש של Compose ב-aosp/3692572. עם זאת, השינוי הזה לא נכלל בגרסה הנוכחית, והוא מתוכנן לגרסה הבאה.

Navigation Testing Library

  • הוספת מודול navigationevent-testing כדי לספק כלי בדיקה ייעודיים לספריית navigationevent. (0e50b6)
  • הוספת מחלקה פיקטיבית של כלי עזר לבדיקה.TestNavigationEventCallback הוא מתעד קריאות לשיטת קריאה חוזרת ומאחסן פריטים שהתקבלו NavigationEvent כדי לתמוך באימות. (4a0246)
  • הוספתי פונקציית כלי פיקטיבית TestNavigationEvent כדי ליצור מופעים של NavigationEvent עם ערכי ברירת מחדל, וכך לפשט את בדיקות היחידה לעיבוד אירועי ניווט. (3b63f5)
  • הוספת מחלקה פיקטיבית של כלי עזר לבדיקה.TestNavigationEventDispatcherOwner הוא עוקב אחרי מספרים של אירועי חזרה למצב קודם ואירועים של שינוי מצב מופעל, כדי לתמוך באימות אינטראקציות בבדיקות. (c8753e)

שינויים ב-API

  • מעבירים את NavigationEventInputHandler מ-androidMain אל commonMain כדי שיהיה זמין בקוד המשותף של KMP. להוסיף public send* שיטות חדשות לשליחת אירועים. שינוי פונקציות השליחה ב-NavigationEventDispatcher מ-public ל-internal. עכשיו המשתמשים צריכים להשתמש ב-NavigationEventInputHandler כדי לשלוח אירועים. (Ia7114)
  • שינוי השם של NavigationInputHandler לOnBackInvokedInputHandler. (I63405)

תיקוני באגים

  • מבצעים רפקטורינג של NavigationEventDispatcher כדי לצמצם את התקורה על ידי הימנעות מהקצאות של רשימות ביניים ושיפור הביצועים של שליחת קריאות חוזרות. (I82702, ‏ I1a9d9)
  • הוספנו הערות (annotations) מסוג @FloatRange לשדות touchX,‏ touchY ו-progress ב-NavigationEvent כדי לאכוף טווחי ערכים תקינים בזמן הקומפילציה ולשפר את הבטיחות של ה-API. (Iac0ec)

גרסה ‎1.0.0-alpha04

‫2 ביולי 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha04 מופץ. גרסה ‎1.0.0-alpha04 מכילה את השמירות האלה.

תיקוני באגים

  • השתמשתי ב-implementedInJetBrainsFork כדי navigationevent-compose והוספתי יעד commonStubs בהתאם למוסכמות של Compose. בקשת שינוי מ-JetBrains. (f60c79)
  • בוצע תיקון של היישום של התוסף של מהדר Compose ל-Kotlin/Native כדי להבטיח יצירה נכונה של קובץ stub. אין השפעה על ממשקי API ציבוריים או על אופן הפעולה שלהם. (1890c9)

גרסה ‎1.0.0-alpha03

‫18 ביוני 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha03 מופץ. גרסה ‎1.0.0-alpha03 מכילה את השמירות האלה.

תכונות חדשות

  • הוספנו מודול חדש, navigationevent-compose, כדי לתמוך בתכונות של Jetpack Compose בספרייה navigationevent. (980d78)
  • NavigationEvent נוספה לקומפוזיציה LocalNavigationEventDispatcherOwner קומפוזיציה מקומית חדשה. היא מחזירה ערך שניתן להגדרה כ-null כדי לקבוע טוב יותר אם היא זמינה בקומפוזיציה הנוכחית. הפונקציה NavigationEventHandler תציג עכשיו שגיאה אם לא נמצא הבעלים הבסיסי. (62ffda)
  • NavigationEvent נוסף NavigationEventHandler Composable חדש ל-Compose כדי לטפל באירועים (תנועת חזרה עם חיזוי). היא מספקת Flow של NavigationEvent אובייקטים שצריך לאסוף בפונקציית ה-lambda להשהיה שסיפקת c42ba6:
NavigationEventHandler { progress: Flow<NavigationEvent> ->
  // This block is executed when the back gesture begins.
  try {
    progress.collect { backEvent ->
      // Handle gesture progress updates here.
    }
    // This block is executed if the gesture completes successfully.
  } catch (e: CancellationException) {
    // This block is executed if the gesture is cancelled
    throw e
  } finally {
    // This block is executed either the gesture is completed or cancelled
  }
}

שינויים ב-API

  • כל NavigationEventCallback יכול להיות רשום רק אצל NavigationEventDispatcher אחד בכל פעם. הוספה של NavigationEventCallback לכמה משגרים תגרום להצגת IllegalStateException. שימו לב שההתנהגות הזו שונה מOnBackPressedDispatcher, שמאפשרת שימוש בכמה מעבירים. (e82c19)
  • הפכנו את isPassThrough ל-val כדי למנוע מוטציה במהלך הניווט, שיכולה לשבש את השליחה של NavigationEvent. (I0b287)

גרסה ‎1.0.0-alpha02

‫4 ביוני 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha02 מופץ. גרסה ‎1.0.0-alpha02 מכילה את השמירות האלה.

שינויים ב-API

  • מחליפים את ה-constructor המשני של NavigationEventDispatcher בארגומנטים שמוגדרים כברירת מחדל. (I716a0)
  • הסרת מאפיין העדיפות מהמאפיין NavigationEventCallback. במקום זאת, צריך להעביר את העדיפות אל NavigationEventDispatcher.addCallback(). (I13cae)

תיקוני באגים

  • תוקנה בעיה ConcurrentModificationException שיכולה לקרות כשמתבצעת קריאה ל-NavigationEventCallback.remove() בגלל שינוי בו-זמני של הרשימה הפנימית של רכיבים שניתן לסגור. (b/420919815)

גרסה ‎1.0.0-alpha01

‫20 במאי 2025

androidx.navigationevent:navigationevent-*:1.0.0-alpha01 מופץ. גרסה 1.0.0-alpha01 מכילה את השמירות האלה.

תכונות חדשות

  • ספריית androidx.navigationevent מספקת API שמתמקד ב-KMP לטיפול בפעולת החזרה למערכת, וגם בתכונת החזרה החזויה. ‫NavigationEventDispatcher משמש כממשקי API משותפים לרישום של מופע אחד או יותר של NavigationEventCallback לקבלת אירועים של חזרה למערכת.
  • השכבה הזו נמצאת מתחת לממשקי ה-API שפורסמו בעבר ב-androidx.activity, והיא נועדה להיות תחליף פחות דעתני לשימוש בממשקי Activity API ברכיבים ברמה גבוהה יותר או לשימוש ישיר בממשקי Android framework OnBackInvokedDispatcher API. ממשקי ה-API של androidx.activity נכתבו מחדש על בסיס ממשקי ה-API של אירועי הניווט כחלק מ-Activity 1.12.0-alpha01.