NavHost — یہ کیا ہے، Jetpack Compose میں نیویگیشن گراف اور روٹ بنانا

مصنف: IT Sectr اشاعت: 2026-06-30 مطالعے کا وقت: 7 منٹ

NavHost ایک composable کنٹینر ہے جو Jetpack Compose میں نیویگیشن گراف کے لیے داخلی نقطہ کے طور پر کام کرتا ہے۔ یہ NavController کو روٹس کے ایک سیٹ سے جوڑتا ہے اور بیک اسٹیک کی حالت کی بنیاد پر موجودہ اسکرین کو رینڈر کرتا ہے۔ Android Developers (2025) کے مطابق، NavHost نیویگیشن والی کسی بھی Compose ایپلیکیشن کے لیے ایک لازمی جزو ہے۔ NavHost کے اندر، اختیاری آرگیومینٹس، ڈیپ لنکس اور اینیمیشنز کے ساتھ composable روٹس رجسٹر کیے جاتے ہیں۔ ہر روٹ ایک عام composable فنکشن ہے جو ٹرانزیشن ڈیٹا کے ساتھ NavBackStackEntry وصول کرتا ہے۔ NavHost خود بخود بیک پریس، اسٹیٹ سیو کرنے اور دوبارہ ترتیب دینے پر بحالی کو ہینڈل کرتا ہے۔

اہم نکات

  • NavHost — ایک composable کنٹینر جو NavController کو روٹ گراف سے جوڑتا ہے اور موجودہ اسکرین رینڈر کرتا ہے
  • composable() — روٹ، آرگیومینٹس، ڈیپ لنکس اور ٹرانزیشن اینیمیشنز کے ساتھ روٹ رجسٹر کرنے کا فنکشن
  • startDestination — NavHost بناتے وقت کھولا جانے والا ابتدائی روٹ
  • آرگیومینٹس اسکرینوں کے درمیان ٹائپ شدہ ڈیٹا منتقلی کے لیے navArgument اور NavType کے ذریعے بیان کیے جاتے ہیں
  • اینیمیشن enterTransition، exitTransition پیرامیٹرز کے ذریعے عالمی یا انفرادی طور پر ترتیب دی جاتی ہے

Jetpack Compose میں NavHost کیا ہے؟

NavHost ایک composable فنکشن ہے جو موجودہ نیویگیشن اسکرین دکھانے کے لیے ایک کنٹینر فراہم کرتا ہے۔ NavHost ایک NavController، startDestination اور Kotlin DSL کے ذریعے بنایا گیا روٹ گراف لیتا ہے۔ جب موجودہ روٹ بدلتا ہے، NavHost مخصوص اینیمیشن کے ساتھ دکھائے جانے والے composable کو سوئچ کرتا ہے۔

NavHost ایک اسکرین سوئچر کے طور پر کام کرتا ہے: یہ NavController سے موجودہ NavBackStackEntry کو ٹریک کرتا ہے اور متعلقہ composable بلاک کو رینڈر کرتا ہے۔ ہر اسکرین ایک آزاد composable فنکشن ہے جو روٹ آرگیومینٹس کے ساتھ NavBackStackEntry وصول کرتی ہے۔ تمام اسکرینیں ایک واحد کمپوزیشن ٹری میں موجود ہوتی ہیں، لیکن NavHost ایک بار میں صرف ایک دکھاتا ہے، باقی کو اینیمیشن کے ذریعے چھپاتا ہے۔

FragmentManager کے برعکس، NavHost ہر اسکرین کے لیے Fragment نہیں بناتا۔ پورا لائف سائیکل CompositionLifecycle کے ذریعے منظم کیا جاتا ہے — composable فنکشنز میں onStart/onResume نہیں ہوتا، اس لیے سائیڈ ایفیکٹس کے لیے LaunchedEffect اور DisposableEffect استعمال کیے جاتے ہیں۔ NavHost خود بخود NavController کو سبسکرائب کرتا ہے اور روٹ بدلنے پر UI کو دوبارہ کمپوز کرتا ہے۔

Google کے مطابق، NavHost Navigation 2.4.0 سے ایک مستحکم API ہے۔ 2.8.0 سے شروع کرتے ہوئے، NavHost Kotlin Serialization کے ذریعے Type-Safe نیویگیشن کو سپورٹ کرتا ہے، سٹرنگ روٹس کو ڈیٹا کلاسز سے بدل دیتا ہے۔ NavHost نیسٹڈ گراف کو بھی سپورٹ کرتا ہے، جو ماڈیول پر مبنی نیویگیشن تنظیم کو قابل بناتا ہے۔

NavHost دو لازمی پیرامیٹرز کے ساتھ بنایا جاتا ہے: navController (NavHostController کی ایک مثال) اور startDestination (پہلی اسکرین کا روٹ سٹرنگ)۔ تیسرا پیرامیٹر ایک بلڈر بلاک ہے جہاں composable()، navigation() اور dialog() کے ذریعے تمام روٹس رجسٹر کیے جاتے ہیں۔

kotlin
@Composable
fun AppNavHost(navController: NavHostController) {
    NavHost(
        navController = navController,
        startDestination = "home"
    ) {
        composable("home") { HomeScreen(navController) }
        composable("settings") { SettingsScreen(navController) }
    }
}

startDestination وہ روٹ ہے جو NavHost پہلی بار لانچ ہونے پر کھلتا ہے۔ اگر بیک اسٹیک خالی ہے، NavHost خود بخود startDestination کو اسٹیک میں شامل کرتا ہے۔ دوبارہ ترتیب دینے (اسکرین گھمانے) پر، NavHost savedState سے آخری روٹ بحال کرتا ہے، startDestination کو نہیں۔

BottomNavigation کے لیے، startDestination نیچے والے پینل کے روٹس میں سے ایک ہے۔ باقی پینل روٹس کو علیحدہ composable اندراجات کے طور پر شامل کیا جاتا ہے۔ NavHost کو Scaffold.content کے اندر رکھنا چاہیے — جہاں مرکزی ایپلیکیشن مواد دکھایا جاتا ہے۔ NavHost TopAppBar اور BottomNavigation کو چھوڑ کر تمام دستیاب اونچائی لیتا ہے۔

composable کے ذریعے روٹ رجسٹر کرنا

composable(route, arguments, deepLinks, enterTransition, exitTransition, content) فنکشن NavHost گراف میں ایک روٹ رجسٹر کرتا ہے۔ route پیرامیٹر ایک سٹرنگ ہے جو {paramName} کی شکل میں اختیاری پلیس ہولڈرز کے ساتھ راستہ بیان کرتی ہے۔ نیویگیشن کے دوران پلیس ہولڈر کو ایک حقیقی قدر سے بدل دیا جاتا ہے۔

composable کا content بلاک ایک NavBackStackEntry وصول کرتا ہے جس سے آرگیومینٹس نکالے جاتے ہیں۔ اسکرین کا composable فنکشن صرف اس وقت رینڈر ہوتا ہے جب موجودہ NavController روٹ روٹ سے میل کھاتا ہے۔ مماثلت نہ ہونے پر، composable کمپوزیشن سے ہٹا دیا جاتا ہے، لیکن اس کی حالت rememberSaveable یا SavedStateHandle کے ساتھ ViewModel کے ذریعے محفوظ کی جا سکتی ہے۔

kotlin
composable(
    route = "article/{articleId}",
    arguments = listOf(navArgument("articleId") {
        type = NavType.IntType
        defaultValue = 0
    }),
    deepLinks = listOf(navDeepLink { uriPattern = "https://app.example/article/{articleId}" })
) { backStackEntry ->
    val articleId = backStackEntry.arguments?.getInt("articleId") ?: 0
    ArticleScreen(articleId = articleId)
}

NavHost کے اندر composable اندراجات کی تعداد چند سے سینکڑوں تک ہو سکتی ہے۔ بڑی ایپلیکیشنز کے لیے، روٹس ماڈیولز کے درمیان تقسیم ہوتے ہیں اور نیسٹڈ گراف کے ذریعے جڑے ہوتے ہیں۔ ہر composable کی اپنی اینیمیشن سیٹنگز، ڈیپ لنکس اور آرگیومینٹس ہو سکتے ہیں۔

آرگیومینٹس اور ٹائپ شدہ روٹ پیرامیٹرز

روٹ آرگیومینٹس composable() میں arguments: List<NamedNavArgument> پیرامیٹر کے ذریعے بیان کیے جاتے ہیں۔ ہر آرگیومینٹ navArgument(name) { type; defaultValue } کے ذریعے بیان کیا جاتا ہے۔ NavType آرگیومینٹ کی قسم متعین کرتا ہے: StringType، IntType، LongType، FloatType، BoolType، ParcelableType اور ReferenceType۔

روٹ پیرامیٹرمثال روٹNavType
راستہ (path)"user/{id}"NavType.IntType
استفسار (query)"search?q={query}"NavType.StringType
اختیاری"details/{id}?tab={tab}"StringType + defaultValue=""
Parcelable"checkout/{order}"NavType.ParcelableType

آرگیومینٹس NavBackStackEntry سے arguments?.getInt("id") کے ذریعے نکالے جاتے ہیں۔ لازمی آرگیومینٹس کے لیے، defaultValue چھوڑا جا سکتا ہے — NavType null استعمال کرے گا۔ اختیاری آرگیومینٹس کے لیے defaultValue سیٹ ہونا چاہیے، ورنہ پیرامیٹر غائب ہونے پر نیویگیشن ایک استثناء پھینکے گی۔

Navigation 2.8.0 سے، Type-Safe نیویگیشن کی سفارش کی جاتی ہے: Kotlin Serialization کے ساتھ روٹس کے لیے ایک sealed class یا data class بیان کریں۔ سٹرنگ روٹ کے بجائے، composable<RouteType> { backStackEntry -> } استعمال کریں۔ یہ روٹس میں ٹائپنگ کی غلطیوں کو ختم کرتا ہے اور آرگیومینٹس کے لیے خود بخود NavType پیدا کرتا ہے۔ منتقلی کے لیے، navigation-compose-typesafe انحصار اور Kotlin Serialization پلگ ان شامل کریں۔

نیسٹڈ نیویگیشن گراف

nested graphsnavigation(route, startDestination) فنکشن استعمال کرکے NavHost کے اندر روٹس کو گروپ کرنے کا ایک طریقہ کار۔ نیسٹڈ گراف کا اپنا روٹ سابقہ اور startDestination ہوتا ہے، اور اس کے تمام روٹس سابقہ کے ذریعے قابل رسائی ہوتے ہیں۔ نیسٹڈ گراف ماڈیولر آرکیٹیکچر کے لیے استعمال ہوتے ہیں، جہاں ہر فیچر ماڈیول اپنا ذیلی گراف رجسٹر کرتا ہے۔

نیسٹڈ گراف کے فوائد: ماڈیول کے اندر روٹ تنہائی، اسکرینوں کے ایک گروپ کے لیے متحد بیک اسٹیک، اور اندرونی ساخت ظاہر کیے بغیر سابقہ کے ذریعے نیویگیٹ کرنے کی صلاحیت۔ مثال کے طور پر، "auth" گراف میں "auth/login" اور "auth/register" شامل ہیں۔ نیویگیشن مکمل روٹ کے ذریعے یا startDestination پر ری ڈائریکٹ کے ساتھ سابقہ کے ذریعے ممکن ہے۔

kotlin
NavHost(navController = navController, startDestination = "main") {
    composable("main") { MainScreen(navController) }
    navigation(
        route = "auth",
        startDestination = "auth/login"
    ) {
        composable("auth/login") { LoginScreen(navController) }
        composable("auth/register") { RegisterScreen(navController) }
    }
}

نیسٹڈ گراف گراف کی سطح پر آرگیومینٹ پاسنگ کو سپورٹ کرتے ہیں: گراف کے روٹ میں اعلان کردہ پیرامیٹرز تمام اندرونی روٹس کو پاس کیے جاتے ہیں۔ نیسٹڈ گراف صاف کرنے کے لیے، popBackStack(route) استعمال کریں — یہ تمام اندرونی اندراجات کو ہٹا دے گا۔ نیسٹڈ گراف کی گہرائی کی کوئی حد نہیں ہے، لیکن پڑھنے کی اہلیت کے لیے 3 سے زیادہ سطحوں کی سفارش نہیں کی جاتی۔

اینیمیشن اور ٹرانزیشن حسب ضرورت

NavHost enterTransition، exitTransition، popEnterTransition اور popExitTransition پیرامیٹرز کے ذریعے composable روٹس کے درمیان ٹرانزیشن اینیمیشن کو سپورٹ کرتا ہے۔ اینیمیشنز ایک بار NavHost کے لیے سیٹ کی جاتی ہیں اور تمام روٹس پر لاگو ہوتی ہیں، یا ہر composable کے لیے انفرادی طور پر۔ ڈیفالٹ طور پر، اینیمیشنز غیر فعال ہوتی ہیں۔

عام ترتیب: enterTransition = slideInHorizontally(initialOffsetX = { it }) — اسکرین دائیں طرف سے اندر سلائیڈ ہوتی ہے; exitTransition = slideOutHorizontally(targetOffsetX = { -it }) — اسکرین بائیں طرف باہر سلائیڈ ہوتی ہے۔ پاپ اینیمیشن کے لیے، سمتیں الٹ جاتی ہیں: اسکرین بائیں طرف سے اندر سلائیڈ ہوتی ہے اور دائیں طرف باہر سلائیڈ ہوتی ہے۔ BottomNavigation کے لیے، سلائیڈ کے بغیر fadeIn/fadeOut استعمال کیا جاتا ہے۔

kotlin
NavHost(
    navController = navController,
    startDestination = "home",
    enterTransition = { slideInHorizontally(initialOffsetX = { it }) + fadeIn() },
    exitTransition = { slideOutHorizontally(targetOffsetX = { -it }) + fadeOut() },
    popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }) + fadeIn() },
    popExitTransition = { slideOutHorizontally(targetOffsetX = { it }) + fadeOut() }
) { /* composable routes */ }

حسب ضرورت اینیمیشنز Compose Animation API استعمال کرکے بنائی جاتی ہیں: AnimatedContentTransitionScope کنٹینر کے طول و عرض، اینیمیشن کی پیشرفت اور سمت تک رسائی فراہم کرتا ہے۔ مشترکہ عنصر ٹرانزیشن (ایک عنصر آسانی سے دوسری اسکرین پر منتقل ہوتا ہے) کے لیے، Accompanist Navigation Animation لائبریری یا sharedElement Modifier کے ذریعے حسب ضرورت نفاذ درکار ہے۔ Android Developers (2025) کے مطابق، ڈیفالٹ سلائیڈ اینیمیشن (دائیں سے داخل، بائیں سے خارج) نیویگیشن والی 80% Android ایپلیکیشنز میں استعمال ہوتی ہے۔

اکثر پوچھے گئے سوالات

کیا ایک Activity میں متعدد NavHost استعمال کیے جا سکتے ہیں؟

تکنیکی طور پر ہاں، لیکن سفارش نہیں کی جاتی۔ ہر NavHost ایک آزاد بیک اسٹیک بناتا ہے، جو متحد نیویگیشن کو توڑ دیتا ہے۔ استثناء علیحدہ علاقے ہیں، جیسے مرکزی مواد کے لیے NavHost اور اپنی نیویگیشن کے ساتھ BottomSheet کے لیے NavHost۔

Compose میں NavHost اور Scaffold میں کیا فرق ہے؟

NavHost ایک نیویگیشن کنٹینر ہے جو اسکرینیں سوئچ کرتا ہے۔ Scaffold پورے صفحے کی ترتیب ہے (TopAppBar، BottomNavigation، FloatingActionButton)۔ عام طور پر، NavHost Scaffold.content کے اندر رکھا جاتا ہے۔ Scaffold نیویگیشن کا انتظام نہیں کرتا، یہ صرف UI اجزاء کے لیے سلاٹ فراہم کرتا ہے۔

NavHost کے ذریعے اسکرینوں کے درمیان ViewModel کیسے شیئر کریں؟

ViewModel viewModel() کے ذریعے NavBackStackEntry کے اندر بنایا جاتا ہے۔ اسکرینوں کے درمیان ViewModel شیئر کرنے کے لیے، parentNavController استعمال کریں: مشترکہ ViewModel کو والدین کی اندراج سے باندھیں۔ متبادل NavGraph اسکوپ کے ساتھ DI (Hilt/Koin) ہے۔

NavHost ہر نیویگیشن پر composable کو دوبارہ کیوں بناتا ہے؟

یہ عام رویہ ہے — روٹ چھوڑنے پر NavHost composable کو کمپوزیشن سے ہٹا دیتا ہے۔ حالت محفوظ کرنے کے لیے، UI حالت کے لیے rememberSaveable اور کاروباری منطق کے لیے SavedStateHandle کے ساتھ ViewModel استعمال کریں۔

NavHost میں 404 (نامعلوم روٹ) ہینڈلنگ کیسے شامل کریں؟

آخری روٹ composable("404") شامل کریں اور نامعلوم ڈیپ لنک موصول ہونے پر اس پر جائیں۔ NavHost کا کوئی catch-all روٹ نہیں ہے — navigate() سے پہلے ڈیپ لنک انٹینٹ ہینڈلر میں روٹ چیک کریں۔ اگر روٹ نہ ملے تو 404 پر جائیں۔

خلاصہ

  • NavHost — ایک Navigation Compose composable کنٹینر جو NavController کو روٹ گراف سے جوڑتا ہے اور موجودہ اسکرین رینڈر کرتا ہے
  • composable() روٹ، آرگیومینٹس (NavType)، ڈیپ لنکس اور اینیمیشنز کے ساتھ ایک روٹ رجسٹر کرتا ہے
  • startDestination — NavHost پہلی بار لانچ ہونے پر کھلنے والا ابتدائی روٹ
  • آرگیومینٹس ٹائپنگ کے لیے NavType اور اختیاری پیرامیٹرز کے لیے defaultValue کے ساتھ {param} پلیس ہولڈرز کے ذریعے پاس کیے جاتے ہیں
  • نیسٹڈ گراف navigation() کے ذریعے الگ تھلگ بیک اسٹیک کے ساتھ ماڈیولز کے مطابق روٹس کو گروپ کرنے کی اجازت دیتے ہیں
  • ٹرانزیشن کی اینیمیشن Compose Animation API کا استعمال کرتے ہوئے enterTransition/exitTransition کے ذریعے ترتیب دی جاتی ہے
  • NavHost اضافی کوڈ کے بغیر خود بخود بیک پریس، اسٹیٹ سیونگ اور ڈیپ لنکس کو ہینڈل کرتا ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں