مثال واضح على المكان الذي تحتاج فيه إلى العودة إلى وجهة ما هو عندما يكون التنقل دائريًا. يوضح هذا المستند حالة الاستخدام هذه.
السيناريو
تخيل أن هناك ثلاث وجهات لتطبيقك: "أ" و"ب" و"ج". كما أنها تحتوي على إجراءات تؤدي من أ إلى ب، ومن ب إلى ج، وج إلى أ. يظهر الرسم البياني المقابل للتنقل على النحو التالي:
مع كل إجراء تنقّل، تضيف 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>