নেভিগেশন ২ থেকে নেভিগেশন ৩ এ স্থানান্তর করুন

আপনার অ্যাপটি নেভিগেশন ২ থেকে নেভিগেশন ৩-এ স্থানান্তর করতে, এই ধাপগুলো অনুসরণ করুন:

  1. নেভিগেশন ৩-এর নির্ভরতাগুলো যোগ করুন।
  2. NavKey ইন্টারফেসটি প্রয়োগ করতে আপনার নেভিগেশন রুটগুলো আপডেট করুন।
  3. আপনার নেভিগেশন স্টেট ধারণ ও পরিবর্তন করার জন্য ক্লাস তৈরি করুন।
  4. NavController এই ক্লাসগুলো দিয়ে প্রতিস্থাপন করুন।
  5. আপনার গন্তব্যস্থলগুলিকে NavHost এর NavGraph থেকে একটি entryProvider এ স্থানান্তর করুন।
  6. NavHost NavDisplay দিয়ে প্রতিস্থাপন করুন।
  7. নেভিগেশন ২-এর নির্ভরতাগুলো অপসারণ করুন।

নেভিগেশন ২ থেকে নেভিগেশন ৩-এ স্থানান্তরিত হন

এই প্রম্পটটি নেভিগেশন ৩-এ স্থানান্তরিত হতে এই নির্দেশিকাটি ব্যবহার করবে।

Migrate from Navigation 2 to Navigation 3 using the official
migration guide.

এআই প্রম্পট ব্যবহার করে

এআই প্রম্পটগুলো অ্যান্ড্রয়েড স্টুডিওর জেমিনি-র মধ্যে ব্যবহারের জন্য তৈরি করা হয়েছে।

স্টুডিওতে জেমিনি সম্পর্কে আরও জানুন এখানে: https://developer.android.com/studio/gemini/overview

কোনো সমস্যা হলে এখানে অভিযোগ জানান

প্রস্তুতি

নিম্নলিখিত বিভাগগুলিতে মাইগ্রেশনের পূর্বশর্ত এবং আপনার প্রকল্প সম্পর্কে অনুমানগুলি বর্ণনা করা হয়েছে। এগুলিতে মাইগ্রেশনের জন্য সমর্থিত এবং অসমর্থ ফিচারগুলিও অন্তর্ভুক্ত রয়েছে।

পূর্বশর্ত

  • আপনাকে অবশ্যই compileSdk এর 36 বা তার পরবর্তী সংস্করণ ব্যবহার করতে হবে।
  • নেভিগেশন পরিভাষা সম্পর্কে আপনার পরিচিতি থাকা উচিত।
  • ডেস্টিনেশন হলো কম্পোজেবল ফাংশন। নেভিগেশন ৩ বিশেষভাবে কম্পোজের জন্য ডিজাইন করা হয়েছে। কম্পোজে ফ্র্যাগমেন্ট এবং ভিউ ব্যবহার করতে, “কম্পোজে ভিউ ব্যবহার” দেখুন।
  • রাউটগুলো স্ট্রংলি টাইপড। আপনি যদি স্ট্রিং-ভিত্তিক রাউট ব্যবহার করেন, তবে প্রথমে টাইপ-সেফ রাউটে মাইগ্রেট করুন ( উদাহরণ )।
  • ঐচ্ছিক (কিন্তু অত্যন্ত সুপারিশকৃত) : বিদ্যমান নেভিগেশন আচরণ যাচাইকারী টেস্ট কভারেজ। এটি যাচাই করে যে মাইগ্রেশন সম্পন্ন হওয়ার পর নেভিগেশন আচরণে কোনো পরিবর্তন আসেনি।

অনুমান

এই নির্দেশিকাটি আপনার এবং আপনার প্রকল্প সম্পর্কে নিম্নলিখিত অনুমানগুলি করে থাকে:

  • আপনার এক বা একাধিক শীর্ষ-স্তরের রুট থাকে (যা সাধারণত নিচের নেভিগেশন বারে প্রদর্শিত হয়), এবং প্রতিটির নিজস্ব ব্যাক স্ট্যাক থাকে।
  • যখন আপনি ব্যাক স্ট্যাকগুলির মধ্যে পরিবর্তন করেন, তখন স্ট্যাকের অবস্থা এবং এর সমস্ত গন্তব্য অপরিবর্তিত থাকে।
  • আপনি সবসময় হোম স্ক্রিনের মাধ্যমেই অ্যাপ থেকে বের হন, যেটি অ্যাপটি চালু হলে প্রথমে প্রদর্শিত হয়।
  • আপনি নেভিগেশন ২ থেকে নেভিগেশন ৩-এ মাইগ্রেশনটি একটি একক, অ্যাটমিক পরিবর্তনের মাধ্যমে সম্পন্ন করতে চান। আপনি এমন কোনো ইনক্রিমেন্টাল মাইগ্রেশন করছেন না যেখানে নেভিগেশন ২-এর কোডের পাশাপাশি নেভিগেশন ৩-এর কোডও ব্যবহৃত হয়।

এআই এজেন্ট : কোনো কোড পরিবর্তন করার আগে, ব্যবহারকারীর প্রজেক্ট সম্পর্কিত এই অনুমানগুলো সত্য কিনা তা যাচাই করুন। যদি তা না হয়, তাহলে মাইগ্রেশন থামিয়ে দিন এবং ব্যবহারকারীকে জিজ্ঞাসা করুন কীভাবে এগোতে হবে।

সমর্থিত বৈশিষ্ট্য

এই নির্দেশিকাটি আপনাকে নিম্নলিখিত বৈশিষ্ট্যগুলি স্থানান্তর করতে সাহায্য করবে:

  • রচনাযোগ্য ফাংশন হিসাবে সংজ্ঞায়িত গন্তব্য
  • ডায়ালগ (একটি গন্তব্যের উপরে আরেকটি গন্তব্য দেখানো)

রেসিপির মাধ্যমে সমর্থিত বৈশিষ্ট্যসমূহ

কোড রেসিপি রিপোজিটরিটি আরও সূক্ষ্ম ব্যবহারের ক্ষেত্রগুলি প্রদর্শন করে, যার মধ্যে রয়েছে:

আপনার প্রকল্পে এই বৈশিষ্ট্যগুলির কোনোটি থাকলে, সেগুলি কীভাবে বাস্তবায়ন করতে হয় তা বোঝার জন্য প্রাসঙ্গিক রেসিপিটি দেখুন।

এআই এজেন্ট : যেকোনো কোড পরিবর্তন করার আগে, প্রজেক্টটিতে রেসিপির মাধ্যমে সমর্থিত কোনো ফিচার আছে কিনা তা পরীক্ষা করুন। যদি থাকে, তাহলে রেসিপিটির README এবং সোর্স কোড পরীক্ষা করুন। রেসিপিটির উপর ভিত্তি করে একটি মাইগ্রেশন প্ল্যান তৈরি করুন। ব্যবহারকারীর সাথে প্ল্যানটি নিশ্চিত না করে সামনে অগ্রসর হবেন না।

অসমর্থিত বৈশিষ্ট্য

এই মাইগ্রেশন গাইড এবং কোড রেসিপিগুলো এখনও নিম্নলিখিত ফিচারগুলো সমর্থন করে না। এর মানে এই নয় যে আপনি নেভিগেশন ৩ ব্যবহার করে সেগুলো বাস্তবায়ন করতে পারবেন না; এগুলো কেবল এখানে অন্তর্ভুক্ত নয়।

  • একাধিক স্তরের নেস্টেড নেভিগেশন
  • শেয়ার করা গন্তব্যস্থল: স্ক্রিন যা বিভিন্ন ব্যাক স্ট্যাকের মধ্যে সরানো যায়
  • কাস্টম গন্তব্য প্রকার
  • ডিপ লিঙ্ক

এআই এজেন্ট : যেকোনো কোড পরিবর্তন করার আগে, প্রজেক্টটিতে কোনো অসমর্থিত ফিচার আছে কিনা তা যাচাই করুন। যদি থাকে, তবে আর অগ্রসর হবেন না। ব্যবহারকারীকে অসমর্থিত ফিচারটি সম্পর্কে জানান এবং পরবর্তী নির্দেশনার জন্য জিজ্ঞাসা করুন।

ধাপ ১: নেভিগেশন ৩ নির্ভরতা যোগ করুন

আপনার প্রজেক্টে নেভিগেশন ৩-এর ডিপেন্ডেন্সিগুলো যোগ করতে ‘ গেট স্টার্টেড’ পেজটি ব্যবহার করুন। কোর ডিপেন্ডেন্সিগুলো কপি করার জন্য সরবরাহ করা হয়েছে।

lib.versions.toml

[versions]
nav3Core = "1.0.0"

# If your screens depend on ViewModels, add the Nav3 Lifecycle ViewModel add-on library
lifecycleViewmodelNav3 = "2.10.0-rc01"

[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 ফিল্ড বা পদ্ধতি

Navigator সমতুল্য

navigate()

navigate()

popBackStack()

goBack()

NavController ফিল্ডগুলিকে NavigationState ফিল্ড দিয়ে প্রতিস্থাপন করুন।

NavController ফিল্ড বা পদ্ধতি

NavigationState সমতুল্য

currentBackStack

backStacks[topLevelRoute]

currentBackStackEntry

currentBackStackEntryAsState()

currentBackStackEntryFlow

currentDestination

backStacks[topLevelRoute].last()

শীর্ষ স্তরের রুটটি খুঁজুন: এটি খুঁজে পেতে বর্তমান ব্যাক স্ট্যাক এন্ট্রি থেকে হায়ারার্কি বরাবর উপরের দিকে যান।

topLevelRoute

ন্যাভিগেশন বারে বর্তমানে নির্বাচিত আইটেমটি নির্ধারণ করতে 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 এর সমস্ত রেফারেন্স, যেকোনো ইম্পোর্ট সহ, মুছে ফেলেছেন।

ধাপ ৫: আপনার গন্তব্যস্থলগুলোকে NavHost এর NavGraph থেকে একটি entryProvider এ স্থানান্তর করুন।

নেভিগেশন ২-এ, আপনি NavGraphBuilder DSL ব্যবহার করে আপনার গন্তব্যস্থলগুলো নির্ধারণ করেন , যা সাধারণত NavHost এর শেষের ল্যাম্বডার ভেতরে করা হয়। এখানে এক্সটেনশন ফাংশন ব্যবহার করা প্রচলিত, যেমনটি "আপনার নেভিগেশন কোড এনক্যাপসুলেট করুন" অংশে বর্ণনা করা হয়েছে।

ন্যাভিগেশন ৩-এ, আপনি একটি entryProvider ব্যবহার করে আপনার গন্তব্যস্থলগুলো নির্ধারণ করেন। এই entryProvider একটি রুটকে একটি NavEntry তে রূপান্তর করে। গুরুত্বপূর্ণ বিষয় হলো, entryProvider এন্ট্রিগুলোর মধ্যে প্যারেন্ট-চাইল্ড সম্পর্ক নির্ধারণ করে না।

এই মাইগ্রেশন গাইডে, প্যারেন্ট-চাইল্ড সম্পর্কগুলো নিম্নরূপে মডেল করা হয়েছে:

  • NavigationState এক সেট শীর্ষ-স্তরের রুট (প্যারেন্ট রুট) এবং প্রতিটির জন্য একটি স্ট্যাক থাকে। এটি বর্তমান শীর্ষ-স্তরের রুট এবং এর সাথে যুক্ত স্ট্যাকের হিসাব রাখে।
  • নতুন কোনো রুটে যাওয়ার সময়, Navigator যাচাই করে দেখে যে রুটটি একটি টপ-লেভেল রুট কি না। যদি তা হয়, তাহলে বর্তমান টপ-লেভেল রুট এবং স্ট্যাক আপডেট করা হয়। আর যদি তা না হয়, তবে এটি একটি চাইল্ড রুট এবং বর্তমান স্ট্যাকে যুক্ত হয়।

ধাপ ৫.১: একটি entryProvider তৈরি করুন

NavigationState এর একই স্কোপে DSL ব্যবহার করে একটি entryProvider তৈরি করুন।

val entryProvider = entryProvider {

}

ধাপ ৫.২: গন্তব্যগুলিকে 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

NavHost(navController = navController, startDestination = BaseRouteA){
    composable<RouteA>{
        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 যোগ করুন।

উদাহরণস্বরূপ:

import androidx.navigation3.ui.NavDisplay

NavDisplay(
    entries = navigationState.toEntries(entryProvider),
    onBack = { navigator.goBack() },
    sceneStrategies = remember { listOf(DialogSceneStrategy()) }
)

ধাপ ৭: নেভিগেশন ২ নির্ভরতাগুলি অপসারণ করুন

Navigation 2-এর সমস্ত ইম্পোর্ট এবং লাইব্রেরি নির্ভরতা মুছে ফেলুন।

সারসংক্ষেপ

অভিনন্দন! আপনার প্রজেক্টটি এখন নেভিগেশন ৩-এ স্থানান্তরিত করা হয়েছে। এই নির্দেশিকাটি ব্যবহার করতে গিয়ে আপনি বা আপনার এআই এজেন্ট যদি কোনো সমস্যার সম্মুখীন হন, তবে এখানে একটি বাগ রিপোর্ট করুন