NavController में "पिछली गतिविधियों" की एक सूची होती है. इसमें वे डेस्टिनेशन शामिल होते हैं जिन पर उपयोगकर्ता जा चुका है. जब उपयोगकर्ता आपके ऐप्लिकेशन में अलग-अलग स्क्रीन पर जाता है, तो NavController, पिछली गतिविधियों की सूची में डेस्टिनेशन जोड़ता और हटाता है.
पिछली गतिविधियों की सूची, "लास्ट इन, फ़र्स्ट आउट" डेटा स्ट्रक्चर होती है. इसलिए, NavController सूची में आइटम जोड़ता और हटाता है.
बुनियादी व्यवहार
पिछली गतिविधियों की सूची के व्यवहार के बारे में, इन अहम बातों का ध्यान रखें:
- पहला डेस्टिनेशन: जब उपयोगकर्ता ऐप्लिकेशन खोलता है, तो
NavController, पहले डेस्टिनेशन को पिछली गतिविधियों की सूची में जोड़ता है. - सूची में जोड़ना:
NavController.navigate()को हर कॉल करने पर, दिया गया डेस्टिनेशन सूची में जुड़ जाता है. - सबसे ऊपर मौजूद डेस्टिनेशन को हटाना: ऊपर या वापस जाएं पर टैप करने पर, क्रमशः
NavController.navigateUp()औरNavController.popBackStack()तरीके कॉल होते हैं. इनसे, सूची में सबसे ऊपर मौजूद डेस्टिनेशन हट जाता है. **ऊपर** और **वापस जाएं** में अंतर के बारे में ज़्यादा जानने के लिए, नेविगेशन के सिद्धांत पेज देखें.
वापस जाएं
The 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() को कॉल करना होगा. यहां दिया गया स्निपेट, इसे दिखाता है:
kotlin
...
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 और Views, दोनों में काम करता है.
पॉप अप करते समय, स्थिति सेव करना
किसी डेस्टिनेशन पर जाने के लिए, popUpTo का इस्तेमाल करते समय, पिछली गतिविधियों की सूची और पिछली गतिविधियों की सूची से हटाए गए सभी डेस्टिनेशन की स्थितियों को सेव किया जा सकता है. इसके बाद, उस डेस्टिनेशन पर बाद में जाने पर, पिछली गतिविधियों की सूची और डेस्टिनेशन को वापस लाया जा सकता है. इससे, किसी दिए गए डेस्टिनेशन के लिए स्थिति को बनाए रखा जा सकता है. साथ ही, पिछली गतिविधियों की कई सूचियां बनाई जा सकती हैं.
इसे प्रोग्राम के ज़रिए करने के लिए, नेविगेशन के विकल्पों में popUpTo जोड़ते समय, saveState = true तय करें.
नेविगेशन के विकल्पों में, restoreState = true भी तय किया जा सकता है. इससे, पिछली गतिविधियों की सूची और डेस्टिनेशन से जुड़ी स्थिति अपने-आप वापस आ जाती है.
उदाहरण के लिए:
navController.navigate(
route = route,
navOptions = navOptions {
popUpTo<A>{ saveState = true }
restoreState = true
}
)
एक्सएमएल में स्थिति सेव करने और वापस लाने की सुविधा चालू करने के लिए, उससे जुड़े action में, popUpToSaveState को true
और restoreState को true के तौर पर तय करें.
Compose का उदाहरण
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() में विकल्प पास करने के बारे में सामान्य जानकारी के लिए, विकल्पों के साथ नेविगेट करना गाइड देखें.
एक्सएमएल का उदाहरण
यहां एक्सएमएल में 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"/>
ऐक्शन का इस्तेमाल करके पॉप करना
किसी ऐक्शन का इस्तेमाल करके नेविगेट करते समय, पिछली गतिविधियों की सूची से अतिरिक्त डेस्टिनेशन को पॉप किया जा सकता है. उदाहरण के लिए, अगर आपके ऐप्लिकेशन में लॉगिन करने की शुरुआती प्रोसेस है, तो उपयोगकर्ता के लॉगिन करने के बाद, आपको लॉगिन से जुड़े सभी डेस्टिनेशन को पिछली गतिविधियों की सूची से हटा देना चाहिए. इससे, 'वापस जाएं' बटन पर टैप करने पर, उपयोगकर्ता लॉगिन की प्रोसेस पर वापस नहीं जाएगा.
ज़्यादा जानकारी
ज़्यादा जानकारी के लिए, ये पेज पढ़ें:
- सर्कुलर नेविगेशन: अगर नेविगेशन फ़्लो सर्कुलर हैं, तो पिछली गतिविधियों की सूची में ज़्यादा डेस्टिनेशन जुड़ने से कैसे बचा जा सकता है, इस बारे में जानें.
- डायलॉग डेस्टिनेशन: डायलॉग डेस्टिनेशन की वजह से, पिछली गतिविधियों की सूची को मैनेज करने के तरीके में क्या बदलाव आते हैं, इस बारे में पढ़ें.