ניווט מעגלי

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

תרחיש

נניח שלאפליקציה שלכם יש שלושה יעדים: א', ב' וג'. יש בו גם פעולות מובילות מ-A ל-B, B ל-C ו-C בחזרה ל-A. תרשים הניווט התואם מופיעה כך:

הדגמה של ניווט מעגלי
איור 1. תרשים ניווט מעגלי עם שלושה יעדים: א', ב' וג'.

בכל פעולת ניווט, NavController מוסיף את היעד החדש מקבץ חזרה. לכן, ניווט חוזר ונשנה בזרימה בתרשים הסיבה לכך שהמקבץ האחורי תכיל כמה קבוצות מכל יעד: A, B, ג', א', ב', ג', א', ב', ג'.

הפתרון

כדי להימנע מחזרות במקבץ האחורי, צריך לציין popUpTo() וגם inclusive בשיחה שלך אל NavController.navigate() או פעולת הניווט.

נבחן מקרה שבו אחרי הגעה ליעד C, המקבץ האחורי מכיל מופע של כל יעד: A, B, C. צריך לוודא שהגדרת popUpTo() ו-inclusive בפעולה או בקריאה ל-navigate() שמבצעת את המשתמש מיעד ג' ליעד א'.

במקרה הזה, כשהמשתמש מנווט מיעד C חזרה ליעד א', גם NavController קופץ ל-A. כלומר, היא מסירה את B ו-C את הערימה. בעזרת inclusive = true, הוא גם מקפץ את ה-A הראשון, ופינוי המקבץ

הטמעת פיתוח נייטיב

כך יישמו את הפתרון לעיגול popUpTo() בעיגול כתיבה:

// When creating your `NavGraph` in your `NavHost`.
composable("c") {
    DestinationC(
        onNavigateToA = {
          navController.navigate("a") {
            popUpTo("a") {
              inclusive = true
            }
          }
        },
    )
}

הטמעת תצוגות

כך יישמו את הפתרון לעיגול popUpTo בעיגול צפיות:

<fragment
    android:id="@+id/c"
    android:name="com.example.myapplication.C"
    android:label="fragment_c"
    tools:layout="@layout/fragment_c">

    <action
        android:id="@+id/action_c_to_a"
        app:destination="@id/a"
        app:popUpTo="@+id/a"
        app:popUpToInclusive="true"/>
</fragment>