নেভিগেশন ৩ হলো জেটপ্যাক কম্পোজের জন্য একেবারে গোড়া থেকে ডিজাইন করা একটি নেভিগেশন লাইব্রেরি। এই নির্দেশিকায় ব্যাখ্যা করা হয়েছে কীভাবে Wear OS অ্যাপ্লিকেশনগুলিতে নেভিগেশন ৩ প্রয়োগ করতে হয়।
মূল ধারণা
-
NavKey: আপনার অ্যাপের কোনো গন্তব্য (স্ক্রিন)-এর জন্য একটি টাইপ-সেফ ও সিরিয়ালাইজেবল আইডেন্টিফায়ার। -
NavBackStack: নেভিগেশন ইতিহাস উপস্থাপনকারীNavKeyইনস্ট্যান্সগুলোর একটি পরিবর্তনযোগ্য তালিকা। আপনি সরাসরি এই তালিকা থেকে আইটেম পুশ এবং পপ করতে পারেন। -
rememberNavBackStack: একটি কম্পোজেবল যা কনফিগারেশন পরিবর্তন এবং প্রসেস বন্ধ হয়ে যাওয়ার পরেও ব্যাক স্ট্যাক তৈরি করে এবং তা বজায় রাখে। -
NavDisplay: মূল UI কম্পোনেন্ট যা ব্যাক স্ট্যাক পর্যবেক্ষণ করে এবং সক্রিয় স্ক্রিনটি রেন্ডার করে। -
EntryProvider: একটি ম্যাপিং ডিএসএল যা একটিNavKeyকে তার প্রকৃত@ComposableUI-এর সাথে সংযুক্ত করে। -
SwipeDismissableSceneStrategy: এটি Wear-এর নিজস্ব স্ট্র্যাটেজি যা আপনার স্ক্রিনগুলোকে একটি সোয়াইপ-টু-ডিসমিস জেসচারের আওতায় আনে এবং বিল্ট-ইন ব্যাক অ্যানিমেশনগুলো পরিচালনা করে।
ধাপ ১: নির্ভরতা যোগ করুন
আপনার প্রজেক্টে প্রয়োজনীয় Navigation 3, Wear Compose, এবং Serialization ডিপেন্ডেন্সিগুলো যোগ করুন।
গ্রুভি
dependencies { // Core Navigation 3 APIs implementation "androidx.navigation3:navigation3-runtime:1.2.0-alpha02" implementation "androidx.navigation3:navigation3-ui:1.2.0-alpha02" // Wear OS specific Navigation 3 integration implementation "androidx.wear.compose:compose-navigation3:1.6.1" // Kotlinx Serialization for type-safe routing implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0" }
কোটলিন
dependencies { // Core Navigation 3 APIs implementation("androidx.navigation3:navigation3-runtime:1.2.0-alpha02") implementation("androidx.navigation3:navigation3-ui:1.2.0-alpha02") // Wear OS specific Navigation 3 integration implementation("androidx.wear.compose:compose-navigation3:1.6.1") // Kotlinx Serialization for type-safe routing implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0") }
ধাপ ২: গন্তব্যস্থল ( NavKey ) নির্ধারণ করুন।
স্ক্রিন হলো স্ট্রংলি টাইপড, সিরিয়ালাইজেবল অবজেক্ট বা ডেটা ক্লাস যা NavKey ইন্টারফেস ইমপ্লিমেন্ট করে।
@Serializable sealed interface Screen : NavKey { @Serializable data object Home : Screen @Serializable data class Details(val itemId: String) : Screen }
ধাপ ৩: NavDisplay এবং ব্যাক স্ট্যাক সেটআপ করুন
আপনার অ্যাপ্লিকেশনের রুটে, ব্যাক স্ট্যাক এবং Wear OS সিন স্ট্র্যাটেজি ইনিশিয়ালাইজ করুন, তারপর সেগুলোকে NavDisplay তে যুক্ত করুন।
// 1. Create the persistent back stack starting at the Home screen val backStack = rememberNavBackStack(Screen.Home) // 2. Initialize the Wear OS swipe-to-dismiss strategy val strategy = rememberSwipeDismissableSceneStrategy<NavKey>() // 3. Render the NavDisplay NavDisplay( backStack = backStack, sceneStrategies = listOf(strategy), entryProvider = entryProvider { // 4. Map keys to Composables entry<Screen.Home> { HomeScreen( onNavigateToDetails = { id -> backStack.add(Screen.Details(id)) } ) } entry<Screen.Details> { key -> DetailsScreen( itemId = key.itemId, onBack = { backStack.removeAt(backStack.lastIndex) } ) } } )
ধাপ ৪: নেভিগেশন কার্যক্রম সম্পাদন করুন
যেহেতু ব্যাক স্ট্যাকটি কেবল একটি কাস্টমাইজড MutableList , তাই এর নেভিগেশন অত্যন্ত সহজ। আপনি সরাসরি backStack ইনস্ট্যান্সের উপরেই অপারেশনগুলো সম্পাদন করেন:
- সামনে এগিয়ে যান :
backStack.add(Screen.Details("123")) - পিছনে যান :
backStack.removeLast()অথবাbackStack.removeLastOrNull() - পরিষ্কার এবং রিসেট করুন :
backStack.clear(); backStack.add(Screen.Home)(অথবা স্ট্যাক প্রতিস্থাপন করতে লিস্ট অপারেশন ব্যবহার করুন)।
ধাপ ৫: (ঐচ্ছিক) ভিউমডেলগুলোকে গন্তব্যস্থলে সীমাবদ্ধ করুন
ডিফল্টরূপে, ViewModel গুলো Activity এর স্কোপের মধ্যে থাকে। Navigation 3 একটি নির্দিষ্ট আর্টিফ্যাক্ট ( lifecycle-viewmodel-navigation3 ) প্রদান করে, যার মাধ্যমে একটি ViewModel কে ব্যাক স্ট্যাকের কোনো NavEntry এর মধ্যে নিরাপদে স্কোপ করা যায়। যখন ব্যাক স্ট্যাক থেকে গন্তব্যটি পপ করে সরিয়ে ফেলা হয়, তখন ViewModel-টি ক্লিয়ার হয়ে যায়।
নির্ভরতা যোগ করুন:
implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")আপনার
NavDisplayএরentryDecoratorsএ ViewModel store ডেকোরেটরটি যোগ করুন। ComposerememberSaveableস্টেট ধরে রাখার জন্য কাস্টম ডেকোরেটর দেওয়ার সময় আপনাকে অবশ্যইSaveableStateHolderNavEntryDecoratorটিও স্পষ্টভাবে অন্তর্ভুক্ত করতে হবে।NavDisplay( backStack = backStack, sceneStrategies = listOf(strategy), entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberViewModelStoreNavEntryDecorator() ), entryProvider = entryProvider { entry<Screen.Home> { // Any viewModel() requested here will be scoped to this NavEntry val viewModel: HomeViewModel = viewModel() } } )