नेविगेशन की स्थिति सेव करना और मैनेज करना

इन सेक्शन में, बैक स्टैक को सेव करने और बैक स्टैक में मौजूद एंट्री की स्थिति सेव करने की रणनीतियों के बारे में बताया गया है.

बैक स्टैक सेव करना

उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, यह पक्का करना ज़रूरी है कि आपके ऐप्लिकेशन के नेविगेशन की स्थिति, लाइफ़साइकल के अलग-अलग इवेंट में बनी रहे. इन इवेंट में, कॉन्फ़िगरेशन में हुए बदलाव और प्रोसेस के बंद होने की स्थिति शामिल है. नेविगेशन 3 में, बैक स्टैक पर आपका मालिकाना हक होता है. इसलिए, इसे बनाने या सेव करने के लिए, कोई सख्त दिशा-निर्देश नहीं होते. हालांकि, नेविगेशन 3 में एक ऐसा तरीका उपलब्ध है जिससे आपको सेव किया जा सकने वाला बैक स्टैक मिलता है: rememberNavBackStack.

rememberNavBackStack का इस्तेमाल करें

rememberNavBackStack कंपोजेबल फ़ंक्शन को एक ऐसा बैकस्टैक बनाने के लिए डिज़ाइन किया गया है जो कॉन्फ़िगरेशन में होने वाले बदलावों और प्रोसेस के बंद होने के बाद भी बना रहता है.

rememberNavBackStack के सही तरीके से काम करने के लिए, आपके बैक स्टैक में मौजूद हर बटन को कुछ ज़रूरी शर्तों का पालन करना होगा:

  • NavKey इंटरफ़ेस लागू करना: बैक स्टैक में मौजूद हर बटन के लिए, NavKey इंटरफ़ेस लागू करना ज़रूरी है. यह मार्कर इंटरफ़ेस के तौर पर काम करता है, जो लाइब्रेरी को यह सिग्नल देता है कि पासकोड सेव किया जा सकता है.
  • @Serializable एनोटेशन होना चाहिए: NavKey लागू करने के अलावा, आपकी मुख्य क्लास और ऑब्जेक्ट को @Serializable एनोटेशन के साथ मार्क किया जाना चाहिए.

यहां दिया गया स्निपेट, rememberNavBackStack को सही तरीके से लागू करने का उदाहरण दिखाता है:

@Serializable
data object Home : NavKey

@Composable
fun NavBackStack() {
    val backStack = rememberNavBackStack(Home)
}

अन्य विकल्प: ViewModel में सेव करना

बैक स्टैक को मैनेज करने का एक और तरीका है, उसे ViewModel में सेव करना. ViewModel या किसी अन्य पसंदीदा स्टोरेज का इस्तेमाल करते समय, ऐप्लिकेशन की प्रोसेस बंद होने के बाद भी डेटा को सेव रखने के लिए, आपको ये काम करने होंगे:

  • पक्का करें कि आपकी कुंजियां सीरियल की जा सकें: rememberNavBackStack की तरह ही, आपकी नेविगेशन कुंजियां भी सीरियल की जानी चाहिए.
  • सीरियलाइज़ेशन और डीसीरियलाइज़ेशन को मैन्युअल तरीके से मैनेज करना: हर कुंजी के सीरियलाइज़ किए गए वर्शन को मैन्युअल तरीके से सेव करने और उसे पर्सिस्टेंट स्टोरेज (जैसे, SharedPreferences, डेटाबेस या फ़ाइल) को सेव किया जा सकता है.

ViewModel को NavEntry में स्कोप करना

ViewModels का इस्तेमाल, कॉन्फ़िगरेशन में होने वाले बदलावों के दौरान, 'यूज़र इंटरफ़ेस' से जुड़ी स्थिति को बनाए रखने के लिए किया जाता है. जैसे, स्क्रीन घुमाना. डिफ़ॉल्ट रूप से, ViewModels का दायरा सबसे नज़दीकी ViewModelStoreOwner तक होता है. आम तौर पर, यह आपका Activity या Fragment होता है.

हालांकि, हो सकता है कि आपको पूरे Activity के बजाय, बैक स्टैक में किसी खास NavEntry (जैसे, किसी खास स्क्रीन या डेस्टिनेशन) के लिए ViewModel का स्कोप तय करना हो. इससे यह पक्का होता है कि ViewModel की स्थिति सिर्फ़ तब तक बनी रहती है, जब वह NavEntry बैक स्टैक का हिस्सा होता है. NavEntry के पॉप होने पर, उसकी स्थिति हट जाती है.

androidx.lifecycle:lifecycle-viewmodel-navigation3 ऐड-ऑन लाइब्रेरी में एक NavEntryDecorator होता है, जो इस काम में मदद करता है. यह डेकोरेटर हर NavEntry के लिए एक ViewModelStoreOwner उपलब्ध कराता है. जब किसी NavEntry के कॉन्टेंट में ViewModel बनाया जाता है, तो वह बैक स्टैक में उस NavEntry की कुंजी के दायरे में अपने-आप शामिल हो जाता है. जैसे, Compose में viewModel() का इस्तेमाल करना. इसका मतलब है कि NavEntry को बैक स्टैक में जोड़ने पर ViewModel बन जाता है और हटाने पर मिट जाता है.

ViewModel को NavEntry में बदलने के लिए, NavEntryDecorator का इस्तेमाल करने के लिए यह तरीका अपनाएं:

  1. अपनी app/build.gradle.kts फ़ाइल में androidx.lifecycle:lifecycle-viewmodel-navigation3 डिपेंडेंसी जोड़ें.
  2. NavDisplay बनाते समय, entryDecorators की सूची में rememberSavedStateNavEntryDecorator() जोड़ें.
  3. अपने NavDisplay में अन्य डेकोरेटर जोड़ें.

NavDisplay(
    entryDecorators = listOf(
        // Add the default decorators for managing scenes and saving state
        rememberSceneSetupNavEntryDecorator(),
        rememberSavedStateNavEntryDecorator(),
        // Then add the view model store decorator
        rememberViewModelStoreNavEntryDecorator()
    ),
    backStack = backStack,
    entryProvider = entryProvider { },
)