इन सेक्शन में, बैक स्टैक को सेव करने और बैक स्टैक में मौजूद एंट्री की स्थिति सेव करने की रणनीतियों के बारे में बताया गया है.
बैक स्टैक सेव करना
उपयोगकर्ता अनुभव को बेहतर बनाने के लिए, यह पक्का करना ज़रूरी है कि आपके ऐप्लिकेशन के नेविगेशन की स्थिति, लाइफ़साइकल के अलग-अलग इवेंट में बनी रहे. इन इवेंट में, कॉन्फ़िगरेशन में हुए बदलाव और प्रोसेस के बंद होने की स्थिति शामिल है. नेविगेशन 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
का इस्तेमाल करने के लिए यह तरीका अपनाएं:
- अपनी
app/build.gradle.kts
फ़ाइल मेंandroidx.lifecycle:lifecycle-viewmodel-navigation3
डिपेंडेंसी जोड़ें. NavDisplay
बनाते समय,entryDecorators
की सूची मेंrememberSavedStateNavEntryDecorator()
जोड़ें.- अपने
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 { }, )