अपने नेविगेशन ग्राफ़ के लिए कंपाइल टाइम (कंपाइल का समय) में टाइप सेफ़्टी देने के लिए, पहले से मौजूद टाइप सेफ़्टी एपीआई का इस्तेमाल किया जा सकता है. ये एपीआई तब उपलब्ध होते हैं, जब आपका ऐप्लिकेशन Navigation
Compose या Navigation Kotlin DSL का इस्तेमाल करता है. ये Navigation
2.8.0
से उपलब्ध हैं.
ये एपीआई, एक्सएमएल का इस्तेमाल करके बनाए गए नेविगेशन ग्राफ़ के लिए, सेफ़ आर्ग्युमेंट की तरह काम करते हैं.
रास्ते तय करना
Compose में, टाइप-सेफ़ रूट इस्तेमाल करने के लिए, आपको सबसे पहले अपने रूट दिखाने वाली, सीरियलाइज़ की जा सकने वाली क्लास या ऑब्जेक्ट तय करने होंगे.
सीरियलाइज़ किए जा सकने वाले ऑब्जेक्ट तय करने के लिए, @Serializable
एनोटेशन का इस्तेमाल करें. यह एनोटेशन, Kotlin Serialization प्लग इन से मिलता है.
इस प्लग इन को अपने प्रोजेक्ट में जोड़ा जा सकता है. इसके लिए, इन डिपेंडेंसी को जोड़ें.
अपने रूट के लिए किस तरह के डेटा का इस्तेमाल करना है, यह तय करने के लिए इन नियमों का पालन करें:
- ऑब्जेक्ट: बिना आर्ग्युमेंट वाले रास्तों के लिए ऑब्जेक्ट का इस्तेमाल करें.
- क्लास: आर्ग्युमेंट वाले रूट के लिए, क्लास या डेटा क्लास का इस्तेमाल करें.
KClass<T>
: अगर आपको पैरामीटर पास करने की ज़रूरत नहीं है, तो इसका इस्तेमाल करें. जैसे, पैरामीटर के बिना कोई क्लास या ऐसी क्लास जिसमें सभी पैरामीटर की डिफ़ॉल्ट वैल्यू हों- उदाहरण के लिए:
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
को फिर से बनाकर और उसकी प्रॉपर्टी पढ़कर पाए जा सकते हैं.