Kotlin DSL और नेविगेशन कंपोज़ में सुरक्षा टाइप करें

अपने नेविगेशन ग्राफ़ के लिए कंपाइल टाइम (कंपाइल का समय) में टाइप सेफ़्टी देने के लिए, पहले से मौजूद टाइप सेफ़्टी एपीआई का इस्तेमाल किया जा सकता है. ये एपीआई तब उपलब्ध होते हैं, जब आपका ऐप्लिकेशन Navigation Compose या Navigation Kotlin DSL का इस्तेमाल करता है. ये Navigation 2.8.0 से उपलब्ध हैं.

ये एपीआई, एक्सएमएल का इस्तेमाल करके बनाए गए नेविगेशन ग्राफ़ के लिए, सेफ़ आर्ग्युमेंट की तरह काम करते हैं.

रास्ते तय करना

Compose में, टाइप-सेफ़ रूट इस्तेमाल करने के लिए, आपको सबसे पहले अपने रूट दिखाने वाली, सीरियलाइज़ की जा सकने वाली क्लास या ऑब्जेक्ट तय करने होंगे.

सीरियलाइज़ किए जा सकने वाले ऑब्जेक्ट तय करने के लिए, @Serializable एनोटेशन का इस्तेमाल करें. यह एनोटेशन, Kotlin Serialization प्लग इन से मिलता है. इस प्लग इन को अपने प्रोजेक्ट में जोड़ा जा सकता है. इसके लिए, इन डिपेंडेंसी को जोड़ें.

अपने रूट के लिए किस तरह के डेटा का इस्तेमाल करना है, यह तय करने के लिए इन नियमों का पालन करें:

  • ऑब्जेक्ट: बिना आर्ग्युमेंट वाले रास्तों के लिए ऑब्जेक्ट का इस्तेमाल करें.
  • क्लास: आर्ग्युमेंट वाले रूट के लिए, क्लास या डेटा क्लास का इस्तेमाल करें.
  • KClass<T>: अगर आपको पैरामीटर पास करने की ज़रूरत नहीं है, तो इसका इस्तेमाल करें. जैसे, पैरामीटर के बिना कोई क्लास या ऐसी क्लास जिसमें सभी पैरामीटर की डिफ़ॉल्ट वैल्यू हों
    1. उदाहरण के लिए: Profile::class

सभी मामलों में, ऑब्जेक्ट या क्लास को सीरियल किया जा सकता है.

उदाहरण के लिए:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

अपना ग्राफ़ बनाना

इसके बाद, आपको अपना नेविगेशन ग्राफ़ तय करना होगा. अपने नेविगेशन ग्राफ़ में, कॉम्पोज़ेबल को डेस्टिनेशन के तौर पर तय करने के लिए, composable() फ़ंक्शन का इस्तेमाल करें.

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

इस उदाहरण में इन बातों का ध्यान रखें:

  • composable(), टाइप पैरामीटर लेता है. इसका मतलब है कि composable<Profile>.
  • डेस्टिनेशन का टाइप तय करना, composable("profile") की तरह route स्ट्रिंग पास करने के मुकाबले ज़्यादा बेहतर तरीका है.
  • रूट क्लास, val id: String की तरह हर नेविगेशन आर्ग्युमेंट का टाइप तय करती है. इसलिए, NavArgument की ज़रूरत नहीं है.
  • प्रोफ़ाइल रूट के लिए, toRoute() एक्सटेंशन का तरीका, NavBackStackEntry और उसके आर्ग्युमेंट से Profile ऑब्जेक्ट को फिर से बनाता है.

अपने ग्राफ़ को डिज़ाइन करने के बारे में ज़्यादा जानने के लिए, अपना नेविगेशन ग्राफ़ डिज़ाइन करें पेज देखें.

आखिर में, navigate() फ़ंक्शन का इस्तेमाल करके, अपने कॉम्पोज़ेबल पर नेविगेट किया जा सकता है. इसके लिए, आपको रूट का इंस्टेंस देना होगा:

navController.navigate(Profile(id = 123))

इससे उपयोगकर्ता, नेविगेशन ग्राफ़ में composable<Profile> डेस्टिनेशन पर पहुंच जाता है. id जैसे नेविगेशन आर्ग्युमेंट, NavBackStackEntry.toRoute का इस्तेमाल करके Profile को फिर से बनाकर और उसकी प्रॉपर्टी पढ़कर पाए जा सकते हैं.

अन्य संसाधन