Navigation Compose: یہ کیا ہے، فن تعمیر اور ترقی میں کام

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

Navigation Compose Jetpack Compose پر بنی Android ایپلیکیشنز کے اندر اعلانیہ نیویگیشن کے لیے ایک Jetpack لائبریری ہے۔ FragmentManager یا Intent پر مبنی نیویگیشن کے بجائے، Navigation Compose ایک واحد روٹ گراف پیش کرتا ہے جو NavController اور NavHost کے ذریعے منظم کیا جاتا ہے۔ Google I/O (2025) کے مطابق، Navigation Compose Compose ایپلیکیشنز کے لیے تجویز کردہ نیویگیشن طریقہ ہے، جو 70% سے زیادہ نئے پروجیکٹس میں استعمال ہوتا ہے۔ لائبریری ٹائپ شدہ آرگیومینٹس کی منتقلی، گہرے لنکس، ٹرانزیشن اینیمیشنز اور SavedStateHandle کے ذریعے ViewModel کے ساتھ انضمام کو سپورٹ کرتی ہے۔

اہم نکات

  • Navigation Compose — ایک متحد روٹ گراف کے ساتھ Compose میں اعلانیہ نیویگیشن کے لیے Jetpack لائبریری
  • NavController — مرکزی کنٹرولر جو نیویگیشن اسٹیک اور بیک اسٹیک حالت کو منظم کرتا ہے
  • NavHost — ایک کنٹینر جو روٹ کے ساتھ composable فنکشنز کے ذریعے روٹ گراف کی وضاحت کرتا ہے
  • آرگیومینٹس ٹائپ شدہ پیرامیٹر سپورٹ کے ساتھ NavType اور SavedStateHandle کے ذریعے منتقل کیے جاتے ہیں
  • گہرے لنکس — URI سے خودکار آرگیومینٹ پارسنگ کے ساتھ بیرونی URLs کے ذریعے نیویگیشن

Navigation Compose کیا ہے؟

Navigation Compose Jetpack سوٹ کی ایک لائبریری ہے جو Compose ایپلیکیشنز کے لیے نیویگیشن فریم ورک فراہم کرتی ہے۔ لائبریری View سسٹم کے لیے نیویگیشن کمپونینٹ کے اسی اصولوں پر مبنی ہے، لیکن Compose کی اعلانیہ نوعیت کے مطابق ڈھال لی گئی ہے: FragmentTransaction کے بجائے composable فنکشنز استعمال کیے جاتے ہیں، اور نیویگیشن گراف Kotlin DSL کے ذریعے بنایا جاتا ہے۔

Navigation Compose اور کلاسک نیویگیشن کے درمیان کلیدی فرق FragmentManager کی عدم موجودگی ہے۔ ہر اسکرین ایک composable فنکشن ہے جو روٹ مماثل ہونے پر NavHost میں رینڈر ہوتی ہے۔ بیک اسٹیک Fragment نہیں، بلکہ روٹ، آرگیومینٹس اور حالت کے ساتھ ایک ریکارڈ محفوظ کرتا ہے۔ یہ فن تعمیر کو آسان بناتا ہے اور Fragment پر مبنی نیویگیشن کے عام لائف سائیکل تنازعات کو ختم کرتا ہے۔

Google (2025) کے مطابق، Navigation Compose تجرباتی سے مستحکم ہو گیا ہے اور ورژن 2.8.0 سے Jetpack کا حصہ ہے۔ لائبریری Material3، ٹائپ سیف نیویگیشن (Kotlin Serialization کے ذریعے)، نیسٹڈ گرافس اور ماڈیولرائزیشن کو سپورٹ کرتی ہے۔ واحد حد یہ ہے کہ لائبریری دستی ترتیب کے بغیر BottomNavigation کے لیے ملٹی بیک اسٹیک کو سپورٹ نہیں کرتی، اگرچہ Google اس پر کام کر رہا ہے۔

Navigation Compose کا فن تعمیر تین ہستیوں کے گرد گھومتا ہے: NavController (اسٹیک مینجمنٹ)، NavHost (گراف کنٹینر) اور NavDestination (composable کے ساتھ انفرادی روٹ)۔ ان کے درمیان تعامل اعلانیہ ہے: ڈویلپر روٹس اور آرگیومینٹس بیان کرتا ہے، اور لائبریری لوڈنگ، تحفظ اور بحالی کی حالتوں کو سنبھالتی ہے۔

NavController Navigation Compose کا مرکزی عنصر ہے، جو نیویگیشن اسٹیک کو منظم کرتا ہے۔ یہ rememberNavController() کے ذریعے بنایا جاتا ہے اور NavHost کو منتقل کیا جاتا ہے۔ NavController بیک اسٹیک، موجودہ انٹری پوائنٹ کو محفوظ کرتا ہے اور موخر کارروائیوں (گراف انیشیلائزیشن کے بعد ڈیپ لنک) کو سپورٹ کرتا ہے۔

kotlin
@Composable
fun AppNavigation() {
    val navController = rememberNavController()
    NavHost(navController = navController, startDestination = "home") {
        composable("home") { HomeScreen(navController) }
        composable("profile/{userId}") { backStackEntry ->
            ProfileScreen(
                userId = backStackEntry.arguments?.getString("userId") ?: ""
            )
        }
    }
}

NavController کے اہم طریقے: navigate(route) — روٹ پر جائیں، popBackStack() — پچھلی اسکرین پر واپس جائیں، navigateAndClear(route) — اسٹیک صاف کرکے جائیں۔ NavOptions رویے کی وضاحت کرتے ہیں: launchSingleTop نقل کو روکتا ہے، popUpTo مخصوص روٹ تک اسٹیک صاف کرتا ہے، restoreState پچھلی حالت بحال کرتا ہے۔

گہرائی سے نیسٹڈ composable فنکشنز سے NavController تک رسائی کے لیے، CompositionLocal کے ذریعے NavHostController استعمال کریں۔ LocalNavController NavHost کے اندر ScopedNavController میں فراہم کیا جاتا ہے۔ NavHost کے باہر (مثال کے طور پر، BottomNavigation میں)، کنٹرولر پیرامیٹرز یا ViewModel کے ذریعے منتقل کیا جاتا ہے۔

NavHost ایک composable کنٹینر ہے جو NavController کو روٹ گراف سے جوڑتا ہے۔ ہر روٹ composable(route, arguments, deepLinks) کے ذریعے اعلان کیا جاتا ہے، جہاں route اختیاری {param} پلیس ہولڈرز کے ساتھ ایک روٹ سٹرنگ ہے۔ جب موجودہ روٹ مماثل ہوتا ہے، NavHost متعلقہ composable بلاک رینڈر کرتا ہے۔

روٹ گراف درجہ بندی کے ساتھ بنایا گیا ہے: ایک ماڈیول کے اندر روٹس کو گروپ کرنے کے لیے navigation() کے ذریعے گرافس کو نیسٹ کیا جا سکتا ہے۔ نیسٹڈ گرافس کا اپنا 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) }
    }
}

NavHost خود بخود LocalBackDispatcher کے ذریعے سسٹم بیک بٹن (بیک پریس) کو سنبھالتا ہے۔ Material3 Scaffold میں، یہ ڈیفالٹ طور پر صحیح BottomNavigation آپریشن کے لیے NavController لیتا ہے۔ NavHost روٹ تبدیل ہونے پر composable کو دوبارہ بناتا ہے، لیکن ان پٹ فیلڈز اور اسکرول کے لیے rememberSaveable کے ذریعے حالت کو محفوظ رکھتا ہے۔

اسکرینوں کے درمیان آرگیومینٹس کی منتقلی

Navigation Compose روٹ پیرامیٹرز اور NavType کے ذریعے اسکرینوں کے درمیان ٹائپ شدہ آرگیومینٹس کی منتقلی کو سپورٹ کرتا ہے۔ پیرامیٹرز روٹ میں {paramName} کے طور پر متعین کیے جاتے ہیں اور composable() میں arguments کے ذریعے قسم کی نشاندہی کی جاتی ہے۔ NavType String، Int، Long، Float، Boolean، Parcelable اور Serializable کو سپورٹ کرتا ہے۔

آرگیومینٹ کی قسمNavTypeروٹ کی مثال
StringNavType.StringType"profile/{name}"
IntNavType.IntType"item/{id}"
BooleanNavType.BoolType"settings?enabled={flag}"
ParcelableNavType.ParcelableType"details/{item}"
FloatNavType.FloatType"map?lat={lat}&lng={lng}"

آرگیومینٹس NavBackStackEntry سے arguments?.getType(key) کے ذریعے نکالے جاتے ہیں۔ لازمی پیرامیٹرز کے لیے defaultValue استعمال کریں، اختیاری کے لیے — nullable۔ Parcelable سپورٹ صرف Kotlin Parcelize یا kotlinx.parcelize لائبریری کے ساتھ کام کرتی ہے۔ پیچیدہ اشیاء کے لیے، پوری آبجیکٹ کو سیریلائز کرنے کے بجائے ID منتقل کرنے اور ViewModel کے ذریعے ڈیٹا لوڈ کرنے کی سفارش کی جاتی ہے۔

Navigation 2.8.0 سے، Kotlin Serialization کے ساتھ ٹائپ سیف نیویگیشن متعارف کرائی گئی: روٹس ڈیٹا کلاسز کے طور پر اور آرگیومینٹس فیلڈز کے طور پر متعین کیے جاتے ہیں۔ یہ سٹرنگ روٹس کو ٹائپ شدہ آبجیکٹس سے بدل دیتا ہے اور روٹ ناموں میں غلطیوں کو ختم کرتا ہے۔ منتقلی کے لیے Kotlin Serialization پلگ ان اور navigation-compose-typesafe انحصار درکار ہے۔

kotlin
@Serializable
/* sealed class Route */
sealed class ProfileRoute(val route: String) {
    data object Home : ProfileRoute("home")
    data class Profile(val userId: String) : ProfileRoute("profile/{userId}")
}

گہرے لنکس ایک نیویگیشن میکانزم ہے جو URL یا intent-filter کے ذریعے ایپلیکیشن کی مخصوص اسکرین کھولنے کی اجازت دیتا ہے۔ Navigation Compose میں، گہرے لنکس composable() میں deepLinks پیرامیٹر کے ذریعے کنفیگر کیے جاتے ہیں اور URI پیٹرن سے مماثل ہونے پر خود بخود پروسیس ہوتے ہیں۔

گہرا لنک UriPattern فہرست کے طور پر متعین کیا جاتا ہے: "https://example.com/profile/{userId}". URI پیرامیٹرز خود بخود روٹ آرگیومینٹس میں میپ ہو جاتے ہیں۔ NavController ایپلیکیشن شروع ہونے پر (intent کے ذریعے) اور آپریشن کے دوران (مضمر گہرے لنکس کے ذریعے) گہرے لنکس پروسیس کرتا ہے۔ زیر التواء گہرے لنکس کو سنبھالنے کے لیے، گراف انیشیلائزیشن کے بعد NavController میں handleDeepLink() استعمال کریں۔

Google کے مطابق، گہرے لنکس اس کے لیے تجویز کیے جاتے ہیں: پش نوٹیفیکیشنز (Firebase Dynamic Links)، ای میل تصدیق، مواد کا اشتراک اور ویب لنکس سے کراس نیویگیشن۔ Android 12+ کے لیے، گہرے لنک کی اتھارٹی کی تصدیق کے لیے Digital Asset Links استعمال کیے جاتے ہیں۔ AndroidManifest.xml میں ڈائیلاگ کے بغیر لنکس کھولنے کے لیے autoVerify="true" کے ساتھ intent-filter ہونا چاہیے۔

kotlin
composable(
    route = "profile/{userId}",
    arguments = listOf(navArgument("userId") { type = NavType.StringType }),
    deepLinks = listOf(
        navDeepLink { uriPattern = "https://example.com/profile/{userId}" }
    )
) { backStackEntry ->
    ProfileScreen(userId = backStackEntry.arguments?.getString("userId") ?: "")
}

Navigation Compose میں گہرے لنکس کی حدود: لائبریری موخر گہرے لنکس کو سپورٹ نہیں کرتی — گہرا لنک صرف اس وقت پروسیس ہوتا ہے جب NavHost نے مکمل طور پر گراف بنا لیا ہو۔ اگر گراف انیشیلائزیشن سے پہلے گہرا لنک آتا ہے، تو اسے intent?.data کے ذریعے موخر کرنا چاہیے اور LaunchedEffect میں پروسیس کرنا چاہیے۔ Firebase Dynamic Links کے لیے، Navigation Compose کے ساتھ Firebase Dynamic Links SDK استعمال کریں۔

اسکرینوں کے درمیان ٹرانزیشن اینیمیشنز

Navigation Compose composable() میں enterTransition، exitTransition، popEnterTransition اور popExitTransition پیرامیٹرز کے ذریعے ٹرانزیشن اینیمیشنز کو سپورٹ کرتا ہے۔ اینیمیشنز Compose Animation API کا استعمال کرتے ہوئے لاگو کی جاتی ہیں: fadeIn، slideInHorizontally، expandIn اور دیگر۔ ڈیفالٹ طور پر، اینیمیشن غیر فعال ہے — اسکرینز فوری طور پر تبدیل ہو جاتی ہیں۔

عام اینیمیشن منظرنامے: آگے نیویگیشن کے لیے slideInHorizontally (اسکرین دائیں سے اندر آتی ہے)، واپسی کے لیے slideOutHorizontally (اسکرین دائیں طرف باہر جاتی ہے)۔ BottomNavigation کے لیے، سلائیڈ کے بغیر فیڈ اینیمیشن زیادہ عام طور پر استعمال ہوتی ہے۔ اینیمیشنز NavHost کے ذریعے سیٹ کی جاتی ہیں اور تمام composable پر لاگو ہوتی ہیں جب تک کہ انفرادی اینیمیشنز متعین نہ کی جائیں۔

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

اینیمیشن پیرامیٹرز براہ راست composable() میں دے کر ہر composable کے لیے انفرادی طور پر اینیمیشنز کو اوور رائڈ کیا جا سکتا ہے۔ اہم بات یہ ہے کہ اینیمیشنز سسٹم بیک پریس اینیمیشن سے متصادم نہیں ہونی چاہئیں۔ مشترکہ عنصر کی منتقلی کے لیے، accompanist-navigation-animation لائبریری یا Modifier.graphicsLayer کے ذریعے کسٹم نفاذ درکار ہے۔ Android Developers (2025) کے مطابق، پروڈکشن ایپلیکیشنز کا 80% معیاری نیویگیشن کے لیے افقی سلائیڈ اینیمیشن استعمال کرتا ہے۔

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

Navigation Compose View کے لیے نیویگیشن کمپونینٹ سے کیسے مختلف ہے؟

Navigation Compose Fragment کے بغیر کام کرتا ہے، گراف کے لیے composable فنکشنز اور Kotlin DSL استعمال کرتا ہے۔ نیویگیشن کمپونینٹ (View) FragmentManager اور XML گرافس پر مبنی ہے۔ Compose ورژن آسان، تیز ہے اور اس میں Fragment لائف سائیکل نہیں ہے۔ View کے لیے نیویگیشن کمپونینٹ صرف ہائبرڈ ایپلیکیشنز کے لیے موزوں ہے۔

اسکرینوں کے درمیان ایک پیچیدہ آبجیکٹ کیسے منتقل کیا جائے؟

آبجیکٹ ID منتقل کرنے اور SavedStateHandle کے ساتھ ViewModel کے ذریعے ڈیٹا لوڈ کرنے کی سفارش کی جاتی ہے۔ اگر آبجیکٹ سادہ ہے تو kotlinx.parcelize کے ذریعے Parcelable استعمال کریں۔ براہ راست آرگیومینٹس (Bundle) کے ذریعے بڑی اشیاء منتقل کرنا ~1 MB تک محدود ہے اور TransactionTooLargeException کا سبب بن سکتا ہے۔

کیا Navigation Compose نیسٹڈ گرافس کو سپورٹ کرتا ہے؟

ہاں، NavHost کے اندر navigation(route, startDestination) فنکشن کے ذریعے۔ نیسٹڈ گرافس کا اپنا startDestination ہوتا ہے اور ایک مشترکہ روٹ سابقہ کے تحت یکجا کیے جاتے ہیں۔ یہ ہر فیچر ماڈیول کے لیے الگ تھلگ گرافس کے ساتھ ماڈیولر فن تعمیر کو منظم کرنے کی اجازت دیتا ہے۔

Navigation Compose میں سسٹم بیک بٹن کو کیسے سنبھالا جائے؟

NavController Compose کے BackHandler کے ذریعے بیک پریس کو خود بخود سنبھالتا ہے۔ بیک دبانے پر navController.popBackStack() کال کریں۔ کسٹم ہینڈلنگ (خروج کی تصدیق) کے لیے، popBackStack() کال کرنے سے پہلے BackHandler(enabled = condition) { callback } استعمال کریں۔

کیا Navigation Compose Jetpack Compose Multiplatform کے ساتھ استعمال کیا جا سکتا ہے؟

فی الحال، Navigation Compose Compose Multiplatform میں تعاون یافتہ نہیں ہے۔ کراس پلیٹ فارم پروجیکٹس کے iOS حصے کے لیے، Voyager یا Decompose استعمال کریں۔ Google KMP سپورٹ پر کام کر رہا ہے، لیکن ریلیز کا کوئی شیڈول نہیں ہے۔ صرف Android پروجیکٹس کے لیے، Navigation Compose واحد تجویز کردہ آپشن ہے۔

خلاصہ

  • Navigation Compose — Compose میں اعلانیہ نیویگیشن کے لیے Jetpack لائبریری، روٹ گراف اور NavController کے ذریعے کام کرتی ہے
  • NavController بیک اسٹیک کو منظم کرتا ہے اور نیویگیشن کے لیے navigate، popBackStack طریقے فراہم کرتا ہے
  • NavHost کنٹرولر کو composable() کے ذریعے گراف سے جوڑتا ہے، ماڈیولر فن تعمیر کے لیے نیسٹڈ گرافس کو سپورٹ کرتا ہے
  • آرگیومینٹس NavType کے ذریعے String، Int، Parcelable اور Kotlin Serialization کے ساتھ ٹائپ سیف نیویگیشن سپورٹ کے ساتھ منتقل کیے جاتے ہیں
  • گہرے لنکس URLs اور پش نوٹیفیکیشنز سے بیرونی نیویگیشن کے لیے UriPattern کے ساتھ navDeepLink کے ذریعے کنفیگر کیے جاتے ہیں
  • اینیمیشن ٹرانزیشنز کے لیے Compose Animation API استعمال کرتے ہوئے enterTransition، exitTransition کے ذریعے سیٹ کی جاتی ہے
  • لائبریری اضافی ترتیب کے بغیر KMP اور BottomNavigation کے لیے ملٹی بیک اسٹیک کو سپورٹ نہیں کرتی

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

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

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

مزید پڑھیں