Navigation 3 में, मेटाडेटा का इस्तेमाल अलग-अलग लाइब्रेरी कॉम्पोनेंट के बीच कोई भी जानकारी शेयर करने के लिए किया जाता है. जैसे, NavEntry, Scene, और NavDisplay. मेटाडेटा, Map<String, Any> होता है.
हालांकि, लाइब्रेरी ज़्यादा ऐब्स्ट्रैक्शन उपलब्ध कराती है, ताकि मेटाडेटा को पढ़ना और लिखना आसान हो. साथ ही, यह टाइप-सेफ़ भी हो.
NavEntry मेटाडेटा उपलब्ध कराना
अगर आपका ऐप्लिकेशन सीधे तौर पर NavEntry इंस्टेंस बनाता है, तो आपको NavEntry कंस्ट्रक्टर पैरामीटर का इस्तेमाल करके, एंट्री के लिए मेटाडेटा देना होगा:metadata
when (key) { is Home -> NavEntry(key, metadata = mapOf("key" to "value")) {} }
अगर आपका ऐप्लिकेशन entryProvider DSL का इस्तेमाल करता है, तो आपको entry फ़ंक्शन के metadata पैरामीटर के ज़रिए मेटाडेटा देना होगा. इस फ़ंक्शन के दो ओवरलोड हैं: एक सीधे तौर पर मैप लेता है और दूसरा एक लैम्ब्डा लेता है, जो एंट्री की कुंजी को आर्ग्युमेंट के तौर पर पास करता है:
entry<Home>(metadata = mapOf("key" to "value")) { /* ... */ } entry<Conversation>(metadata = { key: Conversation -> mapOf("key" to "value: ${key.id})") }) { /* ... */ }
Scene मेटाडेटा उपलब्ध कराना
डिफ़ॉल्ट रूप से, Scene.metadata एक कस्टम गेटर का इस्तेमाल करता है. यह entries प्रॉपर्टी में मौजूद आखिरी एंट्री का metadata दिखाता है. अगर null है, तो यह खाली मैप दिखाता है. Scene इंटरफ़ेस लागू करते समय, ज़रूरत के हिसाब से इस डिफ़ॉल्ट व्यवहार को बदला जा सकता है.
मेटाडेटा डीएसएल का इस्तेमाल करना
लाइब्रेरी के 1.1.0-beta01 वर्शन में पेश किया गया मेटाडेटा, डोमेन के हिसाब से खास भाषा (डीएसएल) है. यह मेटाडेटा को सुरक्षित तरीके से बनाने के लिए, टाइप-सेफ़ बिल्डर उपलब्ध कराता है. इसका इस्तेमाल, मेटाडेटा को सेव करने के लिए किया जाता है.Map<String, Any>
मेटाडेटा कुंजियों को तय करना
डीएसएल, NavMetadataKey इंटरफ़ेस पर निर्भर करता है, ताकि मेटाडेटा कुंजी से जुड़ी वैल्यू का टाइप एक जैसा बना रहे.
मेटाडेटा कुंजियों को तय करने का तरीका यह है कि उन्हें क्लास के नेस्ट किए गए ऑब्जेक्ट के तौर पर शामिल किया जाए. अगर फ़ंक्शन या कंपोज़ेबल का इस्तेमाल किया जा रहा है, तो उन्हें उनसे जुड़े ऑब्जेक्ट के तौर पर शामिल किया जाए. ऐसा इसलिए, ताकि उन कुंजियों से जुड़ी वैल्यू पढ़ी जा सकें:
// For classes such as scene strategies or nav entry decorators, you can define the keys // as nested object. class MySceneStrategy<T : Any> : SceneStrategy<T> { // ... object MyStringMetadataKey : NavMetadataKey<String> } // An example from NavDisplay. // Because NavDisplay is a function, the metadata keys are defined in an object with the same name. public object NavDisplay { public object TransitionKey : NavMetadataKey<AnimatedContentTransitionScope<Scene<*>>.() -> ContentTransform> }
डीएसएल का इस्तेमाल करके मेटाडेटा बनाना
मेटाडेटा मैप बनाने के लिए, metadata फ़ंक्शन का इस्तेमाल करें. यह लैम्डा पैरामीटर लेता है. इस लैम्डा में, put फ़ंक्शन का इस्तेमाल करके, मैप में एंट्री जोड़ें. इसके लिए, NavMetadataKey और उससे जुड़ी वैल्यू का इस्तेमाल करें.
entry<Home>( metadata = metadata { put(NavDisplay.TransitionKey) { fadeIn() togetherWith fadeOut() } // An additional benefit of the metadata DSL is the ability to use conditional logic if (condition) { put(MySceneStrategy.MyStringMetadataKey, "Hello, world!") } } ) { // ... }
मेटाडेटा कुंजियों का इस्तेमाल करके मेटाडेटा पढ़ना
मेटाडेटा डीएसएल, NavMetadataKey की मदद से मेटाडेटा को आसानी से पढ़ने के लिए फ़ंक्शन भी उपलब्ध कराता है.
// import androidx.navigation3.runtime.contains // import androidx.navigation3.runtime.get val hasMyString: Boolean = metadata.contains(MySceneStrategy.MyStringMetadataKey) val myString: String? = metadata[MySceneStrategy.MyStringMetadataKey]