एंड्रॉइड नेविगेशन क्यों टूटता है: IllegalArgumentException और NavController

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

«मार्ग खो गया»: क्यों Android Navigation Component पागल हो जाता है

\n\n

क्या आपने कभी अपने Android ऐप को लॉन्च किया, किसी स्क्रीन पर गए, «पीछे» दबाया — और अचानक ऐप IllegalArgumentException: navigation destination xxx is unknown to this NavController त्रुटि के साथ क्रैश हो गया? यदि हाँ — तो आप अकेले नहीं हैं। इस प्रश्न ने Stack Overflow पर हज़ारों व्यूज़ जमा किए हैं, और Jetpack Navigation के साथ काम शुरू करने वाला हर दूसरा डेवलपर इसका सामना करता है।

\n\n

इस लेख में, हम समझेंगे कि IllegalArgumentException navigation destination unknown क्यों होता है, इसका निदान कैसे करें और, सबसे महत्वपूर्ण, इसे कैसे ठीक करें। Kotlin में बहुत सारा लाइव कोड, व्यावहारिक सुझाव और कोई «पानी» नहीं होगा। चलिए शुरू करते हैं!

\n\n

NavController क्या है और यह आपके गंतव्य को क्यों «नहीं जानता»?

\n\n

शुरुआत के लिए — थोड़ा सिद्धांत। NavController Android में नेविगेशन का मुख्य संचालक है। यह नेविगेशन ग्राफ़ — एक XML फ़ाइल जहाँ सभी संभावित मार्गों का वर्णन है — के आधार पर स्क्रीन (fragments या composables) के बीच संक्रमण का प्रबंधन करता है। जब आप navController.navigate(R.id.some_destination) कॉल करते हैं, तो NavController अपने ग्राफ़ में इस ID को खोजता है। यदि नहीं मिलता — तो यह IllegalArgumentException फेंकता है।

\n\n

यह तार्किक लगता है, लेकिन यह रनटाइम पर क्यों होता है, कंपाइलेशन के दौरान नहीं? क्योंकि नेविगेशन ग्राफ़ डायनामिक रूप से लोड होता है, और त्रुटि अक्सर इस तथ्य से संबंधित होती है कि वर्तमान ग्राफ़ (जिसमें NavController है) में अनुरोधित गंतव्य शामिल नहीं है।

\n\n

त्रुटि के सबसे सामान्य परिदृश्य

\n
    \n
  • उस स्क्रीन पर जाने का प्रयास जो वर्तमान ग्राफ़ में वर्णित नहीं है — उदाहरण के लिए, आप fragments स्विच करते हैं, और NavController पिछले वाले से बचा रहता है।
  • \n
  • सही पंजीकरण के बिना डीप लिंक (DeepLink) का उपयोग — ऐप लिंक के माध्यम से लॉन्च होता है, लेकिन ग्राफ़ अभी तक लोड नहीं हुआ है।
  • \n
  • बैक स्टैक साफ़ करना और उसके बाद नेविगेशन का प्रयास — NavController अपने मार्ग «भूल» जाता है।
  • \n
  • गंतव्य की गलत ID — कोड और XML में टाइपो या नाम का बेमेल होना।
  • \n
\n\n

वास्तविक उदाहरण पर विश्लेषण (Kotlin)

\n\n

कल्पना करें, आपके पास दो स्क्रीन वाला एक ऐप है: HomeFragment और ProfileFragment। नेविगेशन ग्राफ़ nav_graph.xml इस तरह दिखता है:

\n\n
<!-- nav_graph.xml -->\n<navigation xmlns:android="http://schemas.android.com/apk/res/android"\n    xmlns:app="http://schemas.android.com/apk/res-auto"\n    android:id="@+id/nav_graph"\n    app:startDestination="@id/homeFragment">\n\n    <fragment\n        android:id="@+id/homeFragment"\n        android:name="com.example.app.HomeFragment"\n        android:label="Home">\n        <action\n            android:id="@+id/action_home_to_profile"\n            app:destination="@id/profileFragment" />\n    </fragment>\n\n    <fragment\n        android:id="@+id/profileFragment"\n        android:name="com.example.app.ProfileFragment"\n        android:label="Profile" />\n</navigation>
\n\n

HomeFragment में, आप संक्रमण करते हैं:

\n\n
// HomeFragment.kt\nval navController = findNavController()\nnavController.navigate(R.id.action_home_to_profile)
\n\n

सब कुछ काम करता है। लेकिन क्या होगा यदि आप किसी अन्य संदर्भ से navController.navigate(R.id.profileFragment) कॉल करने का प्रयास करते हैं — उदाहरण के लिए, Activity या BroadcastReceiver से? या यदि आपने ग्राफ़ को पुनः लोड किया? यहीं पर IllegalArgumentException: navigation destination xxx is unknown to this NavController प्रकट होता है।

\n\n

त्रुटि को पुन: उत्पन्न करना

\n\n

मान लीजिए, आपने टूलबार में «पीछे» बटन जोड़ा और ऐसा कोड लिखा:

\n\n
// MainActivity.kt\nsupportActionBar?.setDisplayHomeAsUpEnabled(true)\n\noverride fun onOptionsItemSelected(item: MenuItem): Boolean                

ब्लॉग

पुस्तक अनुशंसाएँ