Jetpack Compose-এর জন্য সম্পূর্ণ নতুনভাবে ডিজাইন করা নেভিগেশন লাইব্রেরি হল Navigation 3। Wear OS অ্যাপ্লিকেশনে কীভাবে নেভিগেশন ৩ প্রয়োগ করতে হয় তা এই নির্দেশিকা থেকে জানতে পারবেন।
মূল ধারণা
NavKey: আপনার অ্যাপে গন্তব্যের (স্ক্রিন) জন্য টাইপ-সেফ, সিরিয়ালাইজেবল শনাক্তকারী ।NavBackStack:NavKeyইনস্ট্যান্সের একটি পরিবর্তনযোগ্য তালিকা যা নেভিগেশন ইতিহাসকে উপস্থাপন করে। আপনি এই তালিকা থেকে সরাসরি আইটেম পুশ ও পপ করেন।rememberNavBackStack: একটি কম্পোজ করার উপযুক্ত আইটেম যা কনফিগারেশন পরিবর্তন ও প্রসেস ডেথ জুড়ে ব্যাক স্ট্যাক তৈরি ও বজায় রাখে।NavDisplay: ব্যাক স্ট্যাক পর্যবেক্ষণ করে এবং অ্যাক্টিভ স্ক্রিন রেন্ডার করে এমন মূল UI কম্পোনেন্ট।EntryProvider: একটি ম্যাপিং DSL যাNavKey-কে এর আসল@ComposableUI-এর সাথে লিঙ্ক করে।SwipeDismissableSceneStrategy: Wear-নির্দিষ্ট স্ট্র্যাটেজি যা সোয়াইপ-টু-ডিসমিস জেসচারে আপনার স্ক্রিনকে র্যাপ করে এবং বিল্ট-ইন ব্যাক অ্যানিমেশন ম্যানেজ করে।
ধাপ ১: ডিপেন্ডেন্সি যোগ করুন
আপনার প্রোজেক্টে প্রয়োজনীয় Navigation 3, Wear Compose ও Serialization ডিপেন্ডেন্সি যোগ করুন।
গ্ৰুভি
dependencies { // Core Navigation 3 APIs implementation "androidx.navigation3:navigation3-runtime:1.3.0-alpha02" implementation "androidx.navigation3:navigation3-ui:1.3.0-alpha02" // Wear OS specific Navigation 3 integration implementation "androidx.wear.compose:compose-navigation3:1.7.1" // Kotlinx Serialization for type-safe routing implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0" }
Kotlin
dependencies { // Core Navigation 3 APIs implementation("androidx.navigation3:navigation3-runtime:1.3.0-alpha02") implementation("androidx.navigation3:navigation3-ui:1.3.0-alpha02") // Wear OS specific Navigation 3 integration implementation("androidx.wear.compose:compose-navigation3:1.7.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-এর স্কোপ
সাধারণত, ViewModels Activity-এর মধ্যে সীমাবদ্ধ থাকে। নেভিগেশন ৩
ব্যাক স্ট্যাকে ViewModel-কে NavEntry-এর সাথে নিরাপদে
স্কোপ করার জন্য একটি নির্দিষ্ট আর্টিফ্যাক্ট (lifecycle-viewmodel-navigation3) প্রদান করে। ব্যাক স্ট্যাক থেকে গন্তব্য
বেরিয়ে গেলে, ViewModel মুছে যায়।
ডিপেন্ডেন্সি যোগ করুন:
implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")আপনার
NavDisplay-এentryDecoratorsViewModel স্টোর ডেকোরেটর যোগ করুন। এছাড়াও, 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() } } )