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

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

السيناريو

لنفترض أنّ تطبيقك يتضمّن ثلاث وجهات: "أ" و"ب" و"ج". كما أن لديه إجراءات العميل من A إلى B، ومن B إلى C، ومن C إلى A. الرسم البياني للتنقل المقابل تظهر على النحو التالي:

عرض توضيحي للتنقل الدائري
الشكل 1. رسم بياني دائري للتنقّل تشمل ثلاث وجهات: "أ" و"ب" و"ج".

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

الحل

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

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

في هذه الحالة، عندما ينتقل المستخدم من الوجهة C إلى الوجهة A، 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>