অ্যান্ড্রয়েড দক্ষতা
গিটহাবে দেখুন জেটপ্যাক নেভিগেশন ৩
android skills add --skill navigation-3
আপনার অ্যাপটি নেভিগেশন ২ থেকে নেভিগেশন ৩-এ স্থানান্তর করতে, এই ধাপগুলো অনুসরণ করুন:
- নেভিগেশন ৩-এর নির্ভরতাগুলো যোগ করুন।
-
NavKeyইন্টারফেসটি প্রয়োগ করতে আপনার নেভিগেশন রুটগুলো আপডেট করুন। - আপনার নেভিগেশন স্টেট ধারণ ও পরিবর্তন করার জন্য ক্লাস তৈরি করুন।
-
NavControllerএই ক্লাসগুলো দিয়ে প্রতিস্থাপন করুন। - আপনার গন্তব্যস্থলগুলিকে
NavHostএরNavGraphথেকে একটিentryProviderএ স্থানান্তর করুন। -
NavHostNavDisplayদিয়ে প্রতিস্থাপন করুন। - নেভিগেশন ২-এর নির্ভরতাগুলো অপসারণ করুন।
প্রস্তুতি
নিম্নলিখিত বিভাগগুলিতে মাইগ্রেশনের পূর্বশর্ত এবং আপনার প্রকল্প সম্পর্কে অনুমানগুলি বর্ণনা করা হয়েছে। এগুলিতে মাইগ্রেশনের জন্য সমর্থিত এবং অসমর্থ ফিচারগুলিও অন্তর্ভুক্ত রয়েছে।
পূর্বশর্ত
- আপনাকে অবশ্যই
compileSdkএর 36 বা তার পরবর্তী সংস্করণ ব্যবহার করতে হবে। - নেভিগেশন পরিভাষা সম্পর্কে আপনার পরিচিতি থাকা উচিত।
- ডেস্টিনেশন হলো কম্পোজেবল ফাংশন। নেভিগেশন ৩ বিশেষভাবে কম্পোজের জন্য ডিজাইন করা হয়েছে। কম্পোজে ফ্র্যাগমেন্ট এবং ভিউ ব্যবহার করতে, “কম্পোজে ভিউ ব্যবহার” দেখুন।
- রাউটগুলো স্ট্রংলি টাইপড। আপনি যদি স্ট্রিং-ভিত্তিক রাউট ব্যবহার করেন, তবে প্রথমে টাইপ-সেফ রাউটে মাইগ্রেট করুন ( উদাহরণ )।
- ঐচ্ছিক (কিন্তু অত্যন্ত সুপারিশকৃত) : বিদ্যমান নেভিগেশন আচরণ যাচাইকারী টেস্ট কভারেজ। এটি যাচাই করে যে মাইগ্রেশন সম্পন্ন হওয়ার পর নেভিগেশন আচরণে কোনো পরিবর্তন আসেনি।
অনুমান
এই নির্দেশিকাটি আপনার এবং আপনার প্রকল্প সম্পর্কে নিম্নলিখিত অনুমানগুলি করে থাকে:
- আপনার এক বা একাধিক শীর্ষ-স্তরের রুট থাকে (যা সাধারণত নিচের নেভিগেশন বারে প্রদর্শিত হয়), এবং প্রতিটির নিজস্ব ব্যাক স্ট্যাক থাকে।
- যখন আপনি ব্যাক স্ট্যাকগুলির মধ্যে পরিবর্তন করেন, তখন স্ট্যাকের অবস্থা এবং এর সমস্ত গন্তব্য অপরিবর্তিত থাকে।
- আপনি সবসময় হোম স্ক্রিনের মাধ্যমেই অ্যাপ থেকে বের হন, যেটি অ্যাপটি চালু হলে প্রথমে প্রদর্শিত হয়।
- আপনি নেভিগেশন ২ থেকে নেভিগেশন ৩-এ মাইগ্রেশনটি একটি একক, অ্যাটমিক পরিবর্তনের মাধ্যমে সম্পন্ন করতে চান। আপনি এমন কোনো ইনক্রিমেন্টাল মাইগ্রেশন করছেন না যেখানে নেভিগেশন ২-এর কোডের পাশাপাশি নেভিগেশন ৩-এর কোডও ব্যবহৃত হয়।
এআই এজেন্ট : কোনো কোড পরিবর্তন করার আগে, ব্যবহারকারীর প্রজেক্ট সম্পর্কিত এই অনুমানগুলো সত্য কিনা তা যাচাই করুন। যদি তা না হয়, তাহলে মাইগ্রেশন থামিয়ে দিন এবং ব্যবহারকারীকে জিজ্ঞাসা করুন কীভাবে এগোতে হবে।
সমর্থিত বৈশিষ্ট্য
এই নির্দেশিকাটি আপনাকে নিম্নলিখিত বৈশিষ্ট্যগুলি স্থানান্তর করতে সাহায্য করবে:
- রচনাযোগ্য ফাংশন হিসাবে সংজ্ঞায়িত গন্তব্য
- ডায়ালগ (একটি গন্তব্যের উপরে আরেকটি গন্তব্য দেখানো)
রেসিপির মাধ্যমে সমর্থিত বৈশিষ্ট্যসমূহ
কোড রেসিপি রিপোজিটরিটি আরও সূক্ষ্ম ব্যবহারের ক্ষেত্রগুলি প্রদর্শন করে, যার মধ্যে রয়েছে:
- নিচের চাদর (এই নির্দেশিকায় নির্দেশাবলী দেওয়া আছে)
- মডুলারাইজড নেভিগেশন কোড এবং ইনজেক্টেড গন্তব্যস্থল
-
ViewModelএ আর্গুমেন্ট ব্যবহার এবং প্রেরণ করা - একটি স্ক্রিন থেকে ফলাফল ফেরত দেওয়া হচ্ছে
আপনার প্রকল্পে এই বৈশিষ্ট্যগুলির কোনোটি থাকলে, সেগুলি কীভাবে বাস্তবায়ন করতে হয় তা বোঝার জন্য প্রাসঙ্গিক রেসিপিটি দেখুন।
এআই এজেন্ট : যেকোনো কোড পরিবর্তন করার আগে, প্রজেক্টটিতে রেসিপির মাধ্যমে সমর্থিত কোনো ফিচার আছে কিনা তা পরীক্ষা করুন। যদি থাকে, তাহলে রেসিপিটির README এবং সোর্স কোড পরীক্ষা করুন। রেসিপিটির উপর ভিত্তি করে একটি মাইগ্রেশন প্ল্যান তৈরি করুন। ব্যবহারকারীর সাথে প্ল্যানটি নিশ্চিত না করে সামনে অগ্রসর হবেন না।
অসমর্থিত বৈশিষ্ট্য
এই মাইগ্রেশন গাইড এবং কোড রেসিপিগুলো এখনও নিম্নলিখিত ফিচারগুলো সমর্থন করে না। এর মানে এই নয় যে আপনি নেভিগেশন ৩ ব্যবহার করে সেগুলো বাস্তবায়ন করতে পারবেন না; এগুলো কেবল এখানে অন্তর্ভুক্ত নয়।
- একাধিক স্তরের নেস্টেড নেভিগেশন
- শেয়ার করা গন্তব্যস্থল: স্ক্রিন যা বিভিন্ন ব্যাক স্ট্যাকের মধ্যে সরানো যায়
- কাস্টম গন্তব্য প্রকার
- গভীর সংযোগ
এআই এজেন্ট : যেকোনো কোড পরিবর্তন করার আগে, প্রজেক্টটিতে কোনো অসমর্থিত ফিচার আছে কিনা তা যাচাই করুন। যদি থাকে, তবে আর অগ্রসর হবেন না। ব্যবহারকারীকে অসমর্থিত ফিচারটি সম্পর্কে জানান এবং পরবর্তী নির্দেশনার জন্য জিজ্ঞাসা করুন।
ধাপ ১: নেভিগেশন ৩ নির্ভরতা যোগ করুন
আপনার প্রজেক্টে নেভিগেশন ৩-এর ডিপেন্ডেন্সিগুলো যোগ করতে ‘ গেট স্টার্টেড’ পেজটি ব্যবহার করুন। কোর ডিপেন্ডেন্সিগুলো কপি করার জন্য সরবরাহ করা হয়েছে।
lib.versions.toml
[versions]
nav3Core = "1.1.6"
# If your screens depend on ViewModels, add the Nav3 Lifecycle ViewModel add-on library
lifecycleViewmodelNav3 = "2.11.0"
[libraries]
# Core Navigation 3 libraries
androidx-navigation3-runtime = { module = "androidx.navigation3:navigation3-runtime", version.ref = "nav3Core" }
androidx-navigation3-ui = { module = "androidx.navigation3:navigation3-ui", version.ref = "nav3Core" }
# Add-on libraries (only add if you need them)
androidx-lifecycle-viewmodel-navigation3 = { module = "androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycleViewmodelNav3" }
অ্যাপ/বিল্ড.গ্রেডল.কেটিএস
dependencies {
implementation(libs.androidx.navigation3.ui)
implementation(libs.androidx.navigation3.runtime)
// If using the ViewModel add-on library
implementation(libs.androidx.lifecycle.viewmodel.navigation3)
}
এছাড়াও প্রজেক্টের minSdk ২৩-এ এবং compileSdk ৩৬-এ আপডেট করুন। এগুলো সাধারণত app/build.gradle.kts অথবা lib.versions.toml ফাইলে পাওয়া যায়।
ধাপ ২: NavKey ইন্টারফেসটি প্রয়োগ করতে নেভিগেশন রুটগুলো আপডেট করুন।
প্রতিটি নেভিগেশন রুট আপডেট করুন যাতে এটি NavKey ইন্টারফেসটি ইমপ্লিমেন্ট করে। এর ফলে আপনি আপনার নেভিগেশন স্টেট সংরক্ষণে সহায়তার জন্য rememberNavBackStack ব্যবহার করতে পারবেন।
পূর্বে:
@Serializable data object RouteA
পরে:
@Serializable data object RouteA : NavKey
ধাপ ৩: আপনার নেভিগেশন স্টেট ধারণ ও পরিবর্তন করার জন্য ক্লাস তৈরি করুন।
ধাপ ৩.১: একটি নেভিগেশন স্টেট হোল্ডার তৈরি করুন
নিম্নলিখিত কোডটি NavigationState.kt নামের একটি ফাইলে কপি করুন। আপনার প্রোজেক্টের কাঠামোর সাথে মিলিয়ে প্যাকেজের নামটি যোগ করুন।
// package com.example.project import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSerializable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.toMutableStateList import androidx.navigation3.runtime.NavBackStack import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.rememberDecoratedNavEntries import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.runtime.serialization.NavKeySerializer import androidx.savedstate.compose.serialization.serializers.MutableStateSerializer /** * Create a navigation state that persists config changes and process death. */ @Composable fun rememberNavigationState( startRoute: NavKey, topLevelRoutes: Set<NavKey> ): NavigationState { val topLevelRoute = rememberSerializable( startRoute, topLevelRoutes, serializer = MutableStateSerializer(NavKeySerializer()) ) { mutableStateOf(startRoute) } val backStacks = topLevelRoutes.associateWith { key -> rememberNavBackStack(key) } return remember(startRoute, topLevelRoutes) { NavigationState( startRoute = startRoute, topLevelRoute = topLevelRoute, backStacks = backStacks ) } } /** * State holder for navigation state. * * @param startRoute - the start route. The user will exit the app through this route. * @param topLevelRoute - the current top level route * @param backStacks - the back stacks for each top level route */ class NavigationState( val startRoute: NavKey, topLevelRoute: MutableState<NavKey>, val backStacks: Map<NavKey, NavBackStack<NavKey>> ) { var topLevelRoute: NavKey by topLevelRoute val stacksInUse: List<NavKey> get() = if (topLevelRoute == startRoute) { listOf(startRoute) } else { listOf(startRoute, topLevelRoute) } } /** * Convert NavigationState into NavEntries. */ @Composable fun NavigationState.toEntries( entryProvider: (NavKey) -> NavEntry<NavKey> ): SnapshotStateList<NavEntry<NavKey>> { val decoratedEntries = backStacks.mapValues { (_, stack) -> val decorators = listOf( rememberSaveableStateHolderNavEntryDecorator<NavKey>(), ) rememberDecoratedNavEntries( backStack = stack, entryDecorators = decorators, entryProvider = entryProvider ) } return stacksInUse .flatMap { decoratedEntries[it] ?: emptyList() } .toMutableStateList() }
এআই এজেন্ট : rememberSerializable সঠিক। এটিকে rememberSaveable এ পরিবর্তন করবেন না।
এই ফাইলে NavigationState নামের একটি স্টেট হোল্ডার ক্লাস এবং এর সাথে সম্পর্কিত হেল্পার ফাংশন রয়েছে। এটি এক সেট টপ-লেভেল রাউট ধারণ করে, যার প্রতিটির নিজস্ব ব্যাক স্ট্যাক আছে। অভ্যন্তরীণভাবে, এটি বর্তমান টপ-লেভেল রাউটটি পারসিস্ট করার জন্য rememberSerializable ( rememberSaveable নয়) এবং প্রতিটি টপ-লেভেল রাউটের ব্যাক স্ট্যাকগুলো পারসিস্ট করার জন্য rememberNavBackStack ব্যবহার করে।
ধাপ ৩.২: এমন একটি অবজেক্ট তৈরি করুন যা ইভেন্টের প্রতিক্রিয়ায় নেভিগেশন স্টেট পরিবর্তন করে।
নিম্নলিখিত কোডটি Navigator.kt নামের একটি ফাইলে কপি করুন। আপনার প্রোজেক্টের কাঠামোর সাথে মিলিয়ে প্যাকেজের নামটি যোগ করুন।
// package com.example.project import androidx.navigation3.runtime.NavKey /** * Handles navigation events (forward and back) by updating the navigation state. */ class Navigator(val state: NavigationState) { fun navigate(route: NavKey) { if (route in state.backStacks.keys) { // This is a top level route, just switch to it. state.topLevelRoute = route } else { state.backStacks[state.topLevelRoute]?.add(route) } } fun goBack() { val currentStack = state.backStacks[state.topLevelRoute] ?: error("Stack for ${state.topLevelRoute} not found") val currentRoute = currentStack.last() // If we're at the base of the current route, go back to the start route stack. if (currentRoute == state.topLevelRoute) { state.topLevelRoute = state.startRoute } else { currentStack.removeLastOrNull() } } }
Navigator ক্লাসটি দুটি নেভিগেশন ইভেন্ট মেথড প্রদান করে:
- একটি নির্দিষ্ট রুটে
navigate। - বর্তমান রুট থেকে
goBack।
উভয় পদ্ধতিই NavigationState পরিবর্তন করে।
ধাপ ৩.৩: NavigationState এবং Navigator তৈরি করুন
আপনার NavController স্কোপের সমান স্কোপে NavigationState এবং Navigator এর ইনস্ট্যান্স তৈরি করুন।
val navigationState = rememberNavigationState( // ... startRoute = <Insert your starting route>, topLevelRoutes = <Insert your set of top level routes> // ... ) val navigator = remember { Navigator(navigationState) }
ধাপ ৪: NavController প্রতিস্থাপন করুন
NavController নেভিগেশন ইভেন্ট মেথডগুলোকে Navigator সমতুল্য মেথড দিয়ে প্রতিস্থাপন করুন।
| |
|---|---|
| |
| |
NavController ফিল্ডগুলিকে NavigationState ফিল্ড দিয়ে প্রতিস্থাপন করুন।
| |
|---|---|
| |
| |
শীর্ষ স্তরের রুটটি খুঁজুন: এটি খুঁজে পেতে বর্তমান ব্যাক স্ট্যাক এন্ট্রি থেকে হায়ারার্কি বরাবর উপরের দিকে যান। | |
ন্যাভিগেশন বারে বর্তমানে নির্বাচিত আইটেমটি নির্ধারণ করতে NavigationState.topLevelRoute ব্যবহার করুন।
পূর্বে:
// ... val isSelected = navController.currentBackStackEntryAsState().value?.destination.isRouteInHierarchy(key::class) // ... fun NavDestination?.isRouteInHierarchy(route: KClass<*>) = this?.hierarchy?.any { it.hasRoute(route) } ?: false
পরে:
val isSelected = key == navigationState.topLevelRoute
নিশ্চিত করুন যে আপনি NavController এর সমস্ত রেফারেন্স, যেকোনো ইম্পোর্ট সহ, মুছে ফেলেছেন।
ধাপ ৪.১ লাইফসাইকেল-সচেতন লজিক স্থানান্তর করুন
নেভিগেশন ২-এ, NavBackStackEntry , LifecycleOwner ইমপ্লিমেন্ট করে, যা আপনাকে navController.currentBackStackEntry ব্যবহার করে লাইফসাইকেল-সচেতন পদ্ধতিতে লাইফসাইকেল ইভেন্ট শুনতে বা ফ্লো সংগ্রহ করতে দেয়।
নেভিগেশন ৩-এ, NavDisplay প্রতিটি ডেস্টিনেশনের কম্পোজেবল কন্টেন্টের জন্য LocalLifecycleOwner.current এর মাধ্যমে একটি এন্ট্রি-স্কোপড LifecycleOwner প্রদান করে। আরও তথ্যের জন্য ডেস্টিনেশন লাইফসাইকেল দেখুন।
আপনার ডেস্টিনেশনের কম্পোজেবল কন্টেন্টের ভেতরে সরাসরি LocalLifecycleOwner.current রেফারেন্স করে লাইফসাইকেল-সচেতন অপারেশনগুলো সম্পাদন করা উচিত।
উদাহরণস্বরূপ, যদি আপনি ব্যাক স্ট্যাক এন্ট্রি ব্যবহার করে লাইফসাইকেল-সচেতন পদ্ধতিতে একটি ফ্লো সংগ্রহ করেন:
পূর্বে:
// In your destination screen or host val lifecycleOwner = navController.currentBackStackEntry!! val state by flow.collectAsStateWithLifecycle(lifecycleOwner = lifecycleOwner)
পরে:
// Inside the destination composable val state by flow.collectAsStateWithLifecycle()
ধাপ ৫: আপনার গন্তব্যস্থলগুলোকে NavHost এর NavGraph থেকে একটি entryProvider এ স্থানান্তর করুন।
নেভিগেশন ২-এ, আপনি NavGraphBuilder DSL ব্যবহার করে আপনার গন্তব্যস্থলগুলো নির্ধারণ করেন , যা সাধারণত NavHost এর শেষের ল্যাম্বডার ভেতরে করা হয়। এখানে এক্সটেনশন ফাংশন ব্যবহার করা প্রচলিত, যেমনটি "আপনার নেভিগেশন কোড এনক্যাপসুলেট করুন" অংশে বর্ণনা করা হয়েছে।
নেভিগেশন ৩-এ, আপনি একটি entryProvider ব্যবহার করে আপনার গন্তব্যস্থলগুলো নির্ধারণ করেন। এই entryProvider একটি রুটকে একটি NavEntry তে রূপান্তর করে। গুরুত্বপূর্ণ বিষয় হলো, entryProvider এন্ট্রিগুলোর মধ্যে প্যারেন্ট-চাইল্ড সম্পর্ক নির্ধারণ করে না।
এই মাইগ্রেশন গাইডে, প্যারেন্ট-চাইল্ড সম্পর্কগুলো নিম্নরূপে মডেল করা হয়েছে:
-
NavigationStateএক সেট শীর্ষ-স্তরের রুট (প্যারেন্ট রুট) এবং প্রতিটির জন্য একটি স্ট্যাক থাকে। এটি বর্তমান শীর্ষ-স্তরের রুট এবং এর সাথে যুক্ত স্ট্যাকের হিসাব রাখে। - নতুন কোনো রুটে যাওয়ার সময়,
Navigatorযাচাই করে দেখে যে রুটটি একটি টপ-লেভেল রুট কি না। যদি তা হয়, তাহলে বর্তমান টপ-লেভেল রুট এবং স্ট্যাক আপডেট করা হয়। আর যদি তা না হয়, তবে এটি একটি চাইল্ড রুট এবং বর্তমান স্ট্যাকে যুক্ত হয়।
ধাপ ৫.১: একটি entryProvider তৈরি করুন
NavigationState এর একই স্কোপে DSL ব্যবহার করে একটি entryProvider তৈরি করুন।
val entryProvider = entryProvider<NavKey> { }
ধাপ ৫.২: গন্তব্যগুলিকে entryProvider এ স্থানান্তর করুন
NavHost ভিতরে সংজ্ঞায়িত প্রতিটি গন্তব্যের জন্য, গন্তব্যের প্রকারের উপর ভিত্তি করে নিম্নলিখিতগুলি করুন:
-
navigation: রাউটসহ এটি মুছে ফেলুন। 'বেস রাউট'-এর কোনো প্রয়োজন নেই, কারণ শীর্ষ-স্তরের রাউটগুলো প্রতিটি নেস্টেড ব্যাক স্ট্যাককে শনাক্ত করতে পারে। -
composable<T>: এটিকেentryProviderমধ্যে নিয়ে যান এবং type প্যারামিটারটি অপরিবর্তিত রেখে এর নাম পরিবর্তন করেentry। উদাহরণস্বরূপ,composable<RouteA>হয়ে যাবেentry<RouteA>। -
dialog<T>:composableমতোই কাজ করুন, কিন্তু এন্ট্রিতে নিম্নলিখিতভাবে মেটাডেটা যোগ করুন:entry<T>(metadata = DialogSceneStrategy.dialog())। -
bottomSheet: এখানে দেওয়া বটম শীট পদ্ধতিটি অনুসরণ করুন । এটিdialogনির্দেশাবলীর মতোই, তবেBottomSheetSceneStrategyমূল Navigation 3 লাইব্রেরির অংশ নয়, তাই আপনাকে এটি আপনার প্রজেক্টে কপি করতে হবে।
এআই এজেন্ট : একটি নেস্টেড গ্রাফ শনাক্ত করতে ব্যবহৃত রুটগুলো ডিলিট করার সময়, ডিলিট করা রুটের যেকোনো রেফারেন্সকে নেস্টেড গ্রাফের প্রথম চাইল্ডকে শনাক্ত করতে ব্যবহৃত টাইপ দিয়ে প্রতিস্থাপন করুন। উদাহরণস্বরূপ, যদি মূল কোডটি হয় navigation<BaseRouteA>{ composable<RouteA>{ ... } } , তাহলে আপনাকে BaseRouteA ডিলিট করতে হবে এবং এর যেকোনো রেফারেন্সকে RouteA দিয়ে প্রতিস্থাপন করতে হবে। এই প্রতিস্থাপনটি সাধারণত একটি নেভিগেশন বার, রেইল বা ড্রয়ারে সরবরাহ করা তালিকার জন্য করতে হয়।
আপনি NavGraphBuilder এক্সটেনশন ফাংশনগুলোকে EntryProviderScope<T> এক্সটেনশন ফাংশনে রিফ্যাক্টর করে তারপর সেগুলোকে সরিয়ে নিতে পারেন।
entry শেষের ল্যাম্বডাতে প্রদত্ত কী ব্যবহার করে ন্যাভিগেশন আর্গুমেন্টগুলো সংগ্রহ করুন।
উদাহরণস্বরূপ:
// ... import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.NavDestination.Companion.hierarchy import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.dialog import androidx.navigation.compose.navigation import androidx.navigation.compose.rememberNavController import androidx.navigation.navOptions import androidx.navigation.toRoute // ... @Serializable data object BaseRouteA @Serializable data class RouteA(val id: String) @Serializable data object BaseRouteB @Serializable data object RouteB @Serializable data object RouteD @Composable fun NavHostSnippet(navController: NavHostController) { NavHost(navController = navController, startDestination = BaseRouteA){ composable<RouteA>{ entry -> val id = entry.toRoute<RouteA>().id ScreenA(title = "Screen has ID: $id") } featureBSection() dialog<RouteD>{ ScreenD() } } } fun NavGraphBuilder.featureBSection() { navigation<BaseRouteB>(startDestination = RouteB) { composable<RouteB> { ScreenB() } } }
হয়ে যায়:
// ... import androidx.navigation3.runtime.EntryProviderScope import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.scene.DialogSceneStrategy // ... @Serializable data class RouteA(val id: String) : NavKey @Serializable data object RouteB : NavKey @Serializable data object RouteD : NavKey val entryProvider = entryProvider { entry<RouteA>{ key -> ScreenA(title = "Screen has ID: ${key.id}") } featureBSection() entry<RouteD>(metadata = DialogSceneStrategy.dialog()){ ScreenD() } } fun EntryProviderScope<NavKey>.featureBSection() { entry<RouteB> { ScreenB() } }
ধাপ ৬: NavHost NavDisplay দিয়ে প্রতিস্থাপন করুন
NavHost NavDisplay দিয়ে প্রতিস্থাপন করুন।
-
NavHostমুছে ফেলুন এবং এর পরিবর্তেNavDisplayব্যবহার করুন। - প্যারামিটার হিসেবে
entries = navigationState.toEntries(entryProvider)উল্লেখ করুন। এটিentryProviderব্যবহার করে ন্যাভিগেশন স্টেটকে সেই এন্ট্রিগুলোতে রূপান্তর করে যাNavDisplayপ্রদর্শন করে। -
NavDisplay.onBackকেnavigator.goBack()এর সাথে সংযুক্ত করুন। এর ফলে,NavDisplayএর বিল্ট-ইন ব্যাক হ্যান্ডলারের কাজ শেষ হলেnavigatorতার নেভিগেশন স্টেট আপডেট করবে। - আপনার যদি ডায়ালগ ডেস্টিনেশন থাকে, তাহলে
NavDisplayএরsceneStrategiesপ্যারামিটারেDialogSceneStrategyযোগ করুন।
উদাহরণস্বরূপ:
NavDisplay( entries = navigationState.toEntries(entryProvider), onBack = { navigator.goBack() }, sceneStrategies = remember { listOf(DialogSceneStrategy()) } )
ধাপ ৭: নেভিগেশন ২ নির্ভরতাগুলি অপসারণ করুন
Navigation 2-এর সমস্ত ইম্পোর্ট এবং লাইব্রেরি নির্ভরতা মুছে ফেলুন।
সারসংক্ষেপ
অভিনন্দন! আপনার প্রজেক্টটি এখন নেভিগেশন ৩-এ স্থানান্তরিত করা হয়েছে। এই নির্দেশিকাটি ব্যবহার করতে গিয়ে আপনি বা আপনার এআই এজেন্ট যদি কোনো সমস্যার সম্মুখীন হন, তবে এখানে একটি বাগ রিপোর্ট করুন ।