नेविगेशन और पिछली गतिविधियां

NavController में "बैक स्टैक" होता है जिसमें उपयोगकर्ता के डेस्टिनेशन शामिल होते हैं को विज़िट कर चुके हैं. जब उपयोगकर्ता आपके ऐप्लिकेशन में किसी भी स्क्रीन पर जाता है, तो NavController, बैक स्टैक में डेस्टिनेशन को जोड़ता और हटाता है.

स्टैक होने के दौरान, पिछली गतिविधियों को "लास्ट इन, फ़र्स्ट आउट" कहा जाता है का इस्तेमाल किया जा सकता है. कॉन्टेंट बनाने इसलिए NavController आइटम को धकेलता है और स्टैक.

बुनियादी तरीका

पीठ के व्यवहार के बारे में आपको इन मुख्य बातों को ध्यान में रखना चाहिए स्टैक:

  • पहला डेस्टिनेशन: जब उपयोगकर्ता ऐप्लिकेशन खोलता है, तो NavController पहले डेस्टिनेशन को पिछली गतिविधियों में सबसे ऊपर ले जाता है.
  • स्टैक में पुश करना: हर कॉल NavController.navigate() पुश दिए गए डेस्टिनेशन को स्टैक के सबसे ऊपर ले जाएं.
  • टॉप गंतव्य पॉप-अप करना: ऊपर या वापस जाएं पर टैप करने से NavController.navigateUp() और NavController.popBackStack() विधियों का भी इस्तेमाल किया जा सकता है. वे स्टैक से टॉप डेस्टिनेशन को पॉप अप करते हैं. ज़्यादा जानकारी के लिए, अंतर के बारे में ज़्यादा जानकारी के लिए नेविगेशन के सिद्धांत पेज अप ऐरो और वापस जाएं के बीच में.

पॉप बैक

NavController.popBackStack() तरीका, मौजूदा कॉलम को पॉप-अप करने की कोशिश करता है डेस्टिनेशन पेज से, पिछले डेस्टिनेशन पर जाएं और पिछले डेस्टिनेशन पर जाएं. यह उपयोगकर्ता को उसके नेविगेशन इतिहास में एक कदम पीछे ले जाता है. यह वापस आ जाता है एक बूलियन जो बताता है कि वह डेस्टिनेशन पर वापस पॉप-अप हुआ है या नहीं.

किसी खास जगह पर वापस जाएं

किसी खास मंज़िल पर जाने के लिए, आप popBackStack() का भी इस्तेमाल कर सकते हैं. ऐसा करें इसलिए, उसके किसी ओवरलोड का इस्तेमाल करें. ऐसी कई वेबसाइटें हैं जिनका इस्तेमाल करके, आपको आइडेंटिफ़ायर, जैसे कि पूर्णांक id या स्ट्रिंग route. इन ओवरलोड में काफ़ी समय लगता है दिए गए आइडेंटिफ़ायर से जुड़े डेस्टिनेशन पर उपयोगकर्ता को ले जाना. गंभीरता से, वे उस गंतव्य के ऊपर स्टैक पर सबकुछ पॉप करते हैं.

इन ओवरलोड में inclusive बूलियन भी लगता है. यह तय करता है कि NavController को तय किए गए डेस्टिनेशन को, बैक स्टैक से भी पॉप अप करना चाहिए उस पर नेविगेट करना होगा.

उदाहरण के लिए, इस छोटे से स्निपेट का इस्तेमाल करें:

navController.popBackStack(R.id.destinationId, true)

यहां NavController, पूर्णांक आईडी के साथ डेस्टिनेशन पर वापस पॉप-अप होता है destinationId. inclusive आर्ग्युमेंट की वैल्यू true है, इसलिए NavController, पिछली गतिविधियों से दिए गए डेस्टिनेशन को भी पॉप करता है.

विफल पॉप बैक को हैंडल करना

जब popBackStack(), false रिटर्न करता है, तो इसके बाद वाला कॉल NavController.getCurrentDestination(), null दिखाता है. इसका मतलब है कि ऐप्लिकेशन में पिछली डेस्टिनेशन से पिछली मंज़िल को पॉप-अप किया है. इस मामले में, उपयोगकर्ता को सिर्फ़ यह दिखेगा एक खाली स्क्रीन.

यह निम्न मामलों में हो सकता है:

  • popBackStack() ने स्टैक से कुछ नहीं पॉप किया.
  • popBackStack() ने पिछली स्टैक से किसी डेस्टिनेशन को पॉप किया और स्टैक को अब खाली है.

इसे ठीक करने के लिए, आपको नए डेस्टिनेशन पर जाना होगा या finish() पर कॉल करना होगा आपकी गतिविधि पर. नीचे दिया गया स्निपेट इसे दिखाता है:

कोटलिन

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish()
}

java

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish();
}

पॉप-अप करके किसी डेस्टिनेशन पर जाएं

किसी डेस्टिनेशन से नेविगेट करते समय, पिछली गतिविधियों से डेस्टिनेशन हटाने के लिए दूसरे में, उससे जुड़े navigate() फ़ंक्शन में popUpTo() आर्ग्युमेंट जोड़ें कॉल. popUpTo() नेविगेशन लाइब्रेरी को कुछ डेस्टिनेशन हटाने का निर्देश देता है navigate() को किए गए कॉल के हिस्से के तौर पर, पिछली गतिविधियों से. पैरामीटर वैल्यू यह है पिछली गतिविधियों पर किसी डेस्टिनेशन का आइडेंटिफ़ायर. आइडेंटिफ़ायर कोई ऐसा हो सकता है पूर्णांक id या स्ट्रिंग route.

आपके पास inclusive पैरामीटर के लिए, true वैल्यू वाला आर्ग्युमेंट शामिल करने का विकल्प है यह बताने के लिए कि popUpTo() में आपने जो गंतव्य तय किया है, उसे भी पॉप ऑफ़ बैक स्टैक.

इसे प्रोग्राम के हिसाब से लागू करने के लिए, popUpTo() को navigate() को पास करें NavOptions के साथ inclusive को true पर सेट किया गया. यह Compose और व्यू.

पॉप-अप होने पर सेव करें

किसी मंज़िल पर जाने के लिए popUpTo का इस्तेमाल करते समय, आप वैकल्पिक तौर पर पिछली गतिविधियां और सभी डेस्टिनेशन की स्थितियां, बैक स्टैक से पॉप-अप हो जाएंगी. आप इसके बाद, उस डेस्टिनेशन पर नेविगेट करते समय, बैक स्टैक और डेस्टिनेशन को वापस लाएं बाद में कभी नहीं. इसकी मदद से, किसी डेस्टिनेशन के लिए राज्य को सुरक्षित रखा जा सकता है. साथ ही, एक से ज़्यादा बैक स्टैक होने चाहिए.

प्रोग्राम के हिसाब से यह काम करने के लिए, popUpTo को जोड़ते समय saveState = true तय करें आपके नेविगेशन विकल्प.

नेविगेशन के विकल्पों में restoreState = true को तय करके, ये काम भी किए जा सकते हैं पिछली गतिविधियों को अपने-आप वापस ला देता है. साथ ही, गंतव्य.

उदाहरण के लिए:

navController.navigate(
    route = route,
    navOptions =  navOptions {
        popUpTo<A>{ saveState = true }
        restoreState = true
    }
)

एक्सएमएल में स्टेट को सेव और वापस लाने की सुविधा चालू करने के लिए, popUpToSaveState को true के तौर पर तय करें और जुड़े हुए action में restoreState की वैल्यू true है.

एक्सएमएल का उदाहरण

यहां कार्रवाई का इस्तेमाल करके, एक्सएमएल में popUpTo का एक उदाहरण दिया गया है:

<action
  android:id="@+id/action_a_to_b"
  app:destination="@id/b"
  app:popUpTo="@+id/a"
  app:popUpToInclusive="true"
  app:restoreState=”true”
  app:popUpToSaveState="true"/>

उदाहरण लिखें

Compose में इसका पूरा उदाहरण यहां दिया गया है:

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: Any = A
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable<A> {
            DestinationA(
                onNavigateToB = {
                // Pop everything up to, and including, the A destination off
                // the back stack, saving the back stack and the state of its
                // destinations.
                // Then restore any previous back stack state associated with
                // the B destination.
                // Finally navigate to the B destination.
                    navController.navigate(route = B) {
                        popUpTo<A> {
                            inclusive = true
                            saveState = true
                        }
                        restoreState = true
                    }
                },
            )
        }
        composable<B> { DestinationB(/* ... */) }
    }
}

@Composable
fun DestinationA(onNavigateToB: () -> Unit) {
    Button(onClick = onNavigateToB) {
        Text("Go to A")
    }
}

ज़्यादा जानकारी के साथ, आप यहां जाकर NavController.navigate() को कॉल करने का तरीका बदल सकते हैं: इन तरीकों से मदद पाएं:

// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a")
}

// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a") { inclusive = true }
}

// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
    launchSingleTop = true
}

NavController.navigate() में पास करने के विकल्पों के बारे में सामान्य जानकारी के लिए, देखें विकल्पों की गाइड की मदद से नेविगेट करें.

कार्रवाइयों का इस्तेमाल करके पॉप-अप करें

किसी कार्रवाई का इस्तेमाल करके नेविगेट करते समय, आपके पास अतिरिक्त डेस्टिनेशन पॉप करने का विकल्प होता है. हालांकि, ऐसा करना ज़रूरी नहीं है में से एक को हटा दें. उदाहरण के लिए, अगर आपके ऐप्लिकेशन में शुरुआती लॉगिन फ़्लो है, तो अगर किसी उपयोगकर्ता ने लॉग इन किया है, तो आपको लॉगिन से जुड़े सभी डेस्टिनेशन बंद करने होंगे ताकि 'वापस जाएं' बटन उपयोगकर्ताओं को वापस लॉगिन पर न ले जाए फ़्लो.

अतिरिक्त रीडिंग

ज़्यादा जानकारी के लिए, ये पेज पढ़ें:

  • सर्कुलर नेविगेशन: जानें कि ओवरस्टफ़्ड पीठ से कैसे बचा जा सकता है स्टैक को उन मामलों में स्टैक करें जहां नेविगेशन फ़्लो गोलाकार होते हैं.
  • डायलॉग डेस्टिनेशन: डायलॉग डेस्टिनेशन के बारे में जानें पिछली गतिविधियों को मैनेज करने के बारे में खास बातें.