التنقل الدائري

مثال واضح على المكان الذي تحتاج فيه إلى العودة إلى وجهة ما هو عندما يكون التنقل دائريًا. يوضح هذا المستند حالة الاستخدام هذه.

السيناريو

تخيل أن هناك ثلاث وجهات لتطبيقك: "أ" و"ب" و"ج". كما أنها تحتوي على إجراءات تؤدي من أ إلى ب، ومن ب إلى ج، وج إلى أ. يظهر الرسم البياني المقابل للتنقل على النحو التالي:

عرض للتنقل الدائري
الشكل 1. رسم بياني دائري للتنقّل فيه ثلاث وجهات: A وB وC.

مع كل إجراء تنقّل، تضيف NavController الوجهة الجديدة إلى الحزمة الخلفية. وعلى هذا النحو، قد يؤدي التنقل المتكرر خلال التدفق في الرسم التخطيطي إلى احتواء المكدس الخلفي على مجموعات متعددة من كل وجهة: A، B، C، A، B، C، A، B، C.

الحل

لتجنّب التكرار في الحزمة الخلفية، حدِّد السمتَين popUpTo() و inclusive في الطلب الخاص بالطلب NavController.navigate() أو في إجراء التنقّل.

ضع في اعتبارك حالة يكون فيها المكدس الخلفي بعد الوصول إلى الوجهة "ج" مثيلاً واحدًا لكل وجهة: أ، ب، ج. يُرجى التأكّد من أنّك حددت popUpTo() وinclusive في الإجراء أو عبارة "navigate()" التي تنقل المستخدم من الوجهة "ج" إلى الوجهة "أ".

في هذه الحالة، عندما ينتقل المستخدم من الوجهة "ج" إلى الوجهة "أ"، ينبثق NavController أيضًا باتجاه "أ". هذا يعني أنها تزيل B وC من المكدس. مع inclusive = true، ينبثق أيضًا حرف A الأول، لمحو المكدس بشكل فعّال.

إنشاء رسالة التنفيذ

في ما يلي تنفيذ حل خاصية popUpTo() الدائرية في Compose:

// 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>