NavEntryDecorator क्लास का इस्तेमाल करके, डेस्टिनेशन के बारे में ज़्यादा जानकारी दी जा सकती है या उन पर एक जैसा लॉजिक लागू किया जा सकता है. यह क्लास, कंपोज़ेबल फ़ंक्शन के साथ बैक स्टैक में मौजूद हर NavEntry को रैप करती है. दूसरे शब्दों में कहें, तो यह एंट्री के कॉन्टेंट को सजाता है.
कस्टम डेकोरेटर बनाना
डेकोरेटर बनाने के लिए, NavEntryDecorator क्लास को बढ़ाएं और इन तरीकों को बदलें:
decorate- यह एक कंपोज़ेबल लैम्डा है, जिसे आपके बैक स्टैक में मौजूद हरNavEntryके लिए कॉल किया जाता है. इसेNavEntryको पैरामीटर के तौर पर मिलता है. इससे आपको ऐसे स्टेट ऑब्जेक्ट बनाने में मदद मिलती है जो एंट्री केcontentKeyके हिसाब से तय होते हैं.CompositionLocalProviderका इस्तेमाल करके, एंट्री के कॉन्टेंट के लिए डिपेंडेंसी दी जा सकती हैं. कॉन्टेंट को कंपोज़ेबल फ़ंक्शन से भी रैप किया जा सकता है या साइड-इफ़ेक्ट ट्रिगर किए जा सकते हैं. आपको हमेशा इस तरीके के अंदरentry.Content()को कॉल करना चाहिए.onPop- यह एक कॉलबैक है. इसे तब शुरू किया जाता है, जबNavEntryको बैक स्टैक से हटा दिया जाता है और कंपोज़िशन से बाहर कर दिया जाता है. इसे हटाई गई एंट्री काcontentKeyमिलता है.contentKeyका इस्तेमाल करके, उस एंट्री से जुड़ी किसी भी स्थिति की पहचान करें और उसे ठीक करें.
यहां दिए गए उदाहरण में, NavEntryDecorator क्लास को बढ़ाकर कस्टम डेकोरेटर बनाया गया है.
// import androidx.navigation3.runtime.NavEntryDecorator class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>( decorate = { entry -> Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated") entry.Content() }, onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") } )
अगर आपके डेकोरेटर को स्टेट ऐक्सेस करने की ज़रूरत है, तो एक कंपोज़ेबल फ़ंक्शन बनाएं. यह फ़ंक्शन उस स्टेट को बनाता है. इसके बाद, इसका इस्तेमाल डेकोरेटर बनाने के लिए करें. उदाहरण के लिए, rememberSaveableStateHolderNavEntryDecorator का सोर्स कोड देखें. इससे स्थिति बनती है - एक SaveableStateHolder - और इसका इस्तेमाल डेकोरेटर बनाने के लिए किया जाता है.
पिछली ऐक्टिविटी को सजाना
NavEntryDecorator बनाने के बाद, बैक स्टैक में मौजूद एंट्री को इन दो तरीकों में से किसी एक तरीके से सजाएं:
rememberDecoratedNavEntriesका इस्तेमाल करें. यह फ़ंक्शन तब काम आता है, जब आपके पास कई बैक स्टैक हों और हर बैक स्टैक के लिए डेकोरेटर का अपना सेट हो. ज़्यादा जानकारी के लिए, कोड की यह रेसिपी देखें. यह फ़ंक्शन,NavEntryकी एक डेकोरेट की गई सूची दिखाता है. इसका इस्तेमालNavDisplayके साथ किया जा सकता है.NavDisplayपैरामीटर का इस्तेमाल करके, अपने डेकोरेटर को सीधेNavDisplayपर भेजें.entryDecoratorsNavDisplayकॉलrememberDecoratedNavEntriesकरता है और सजाई गई एंट्री दिखाता है.
डिफ़ॉल्ट डेकोरेटर शामिल करना
नेविगेशन 3 में, SaveableStateHolderNavEntryDecorator नाम का एक डिफ़ॉल्ट डेकोरेटर शामिल होता है. यह NavEntry की स्थिति को कॉन्फ़िगरेशन में बदलाव और प्रोसेस बंद होने के दौरान बनाए रखने की सुविधा देता है. यह NavEntry कॉन्टेंट को SaveableStateProvider के साथ रैप करता है. इससे NavEntry कॉन्टेंट में मौजूद rememberSaveable कॉल सही तरीके से काम कर पाते हैं.
अगर आपका डेकोरेटर SaveableStateProvider उपलब्ध नहीं करा रहा है, तो आपको दिए गए डेकोरेटर की सूची में SaveableStateHolderNavEntryDecorator को पहले डेकोरेटर के तौर पर शामिल करना चाहिए. इसे rememberSaveableStateHolderNavEntryDecorator का इस्तेमाल करके बनाया गया है.
उदाहरण के लिए:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
डेकोरेटर का इस्तेमाल कब करना चाहिए
डेकोरेटर का इस्तेमाल इन कामों के लिए करें:
- बैक स्टैक में मौजूद हर
NavEntryके लिए, डिपेंडेंसी बनाएं. उदाहरण के लिए,ViewModelStoreNavEntryDecoratorहरNavEntryके लिए एकViewModelStoreबनाता है. - किसी ऑब्जेक्ट को कई
NavEntryके लिए स्कोप करें. उदाहरण के लिए, कई एंट्री के बीचViewModelशेयर करने के लिए. - एक से ज़्यादा
NavEntryके लिए एक ही कार्रवाई करें. उदाहरण के लिए, हर एंट्री के लिए लॉगिंग, डीबग करने या ट्रेस करने की कार्रवाइयां करना. NavEntryको एक ही कंपोज़ेबल फ़ंक्शन के साथ रैप करें.NavEntryसे जुड़ी क्लीन अप स्टेट. उदाहरण के लिए, जब बैक स्टैक से किसी एंट्री को हटाया जाता है, तोViewModelStoreNavEntryDecoratorउससे जुड़ेViewModelStoreको मिटा देता है.
डेकोरेटर का इस्तेमाल इन कामों के लिए न करें:
- किसी एक
NavEntryको डिपेंडेंसी पास करें. - ऐसी डिपेंडेंसी उपलब्ध कराएं जिनका स्कोप बैक स्टैक से ज़्यादा हो.
इन दोनों ही मामलों में, NavEntry बनाते समय सीधे तौर पर डिपेंडेंसी पास करें.
कोड के अन्य उदाहरणों के लिए, NavEntryDecorator देखें.