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

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

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

একটি এআই এজেন্ট ব্যবহার করুন

আপনি এই নির্দেশিকাটি একটি AI এজেন্টের সাথে ব্যবহার করতে পারেন, যেমন Gemini, Android Studio এর Agent Mode এ । " AI Agent :" দিয়ে শুরু হওয়া এই নির্দেশিকার লাইনগুলি AI এজেন্ট দ্বারা পড়া উচিত কিন্তু মানব পাঠকদের দ্বারা উপেক্ষা করা যেতে পারে।

প্রস্তুতি

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

পূর্বশর্ত

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

অনুমান

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

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

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

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

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

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

রেসিপির মাধ্যমে সমর্থিত বৈশিষ্ট্যগুলি

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

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

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

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

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

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

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

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

আপনার প্রকল্পে নেভিগেশন 3 নির্ভরতা যোগ করতে শুরু করুন পৃষ্ঠাটি ব্যবহার করুন। মূল নির্ভরতাগুলি আপনার অনুলিপি করার জন্য সরবরাহ করা হয়েছে।

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 কে 23 এবং compileSdk কে 36 এ আপডেট করুন। আপনি সাধারণত এগুলি 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 এর ট্রেইলিং ল্যাম্বডার ভিতরে। Encapsulate your navigation code- এ বর্ণিত এক্সটেনশন ফাংশনগুলি এখানে ব্যবহার করা সাধারণ।

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

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

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

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

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

val entryProvider = entryProvider {

}

ধাপ ৫.২: গন্তব্যস্থলগুলিকে entryProvider স্থানান্তর করুন

NavHost ভিতরে সংজ্ঞায়িত প্রতিটি গন্তব্যের জন্য, গন্তব্যের ধরণের উপর ভিত্তি করে নিম্নলিখিতগুলি করুন:

  • navigation : রুট সহ এটি মুছে ফেলুন। "বেস রুট" এর কোন প্রয়োজন নেই কারণ শীর্ষ-স্তরের রুটগুলি প্রতিটি নেস্টেড ব্যাক স্ট্যাক সনাক্ত করতে পারে।
  • composable<T> : এটিকে entryProvider এ স্থানান্তর করুন এবং টাইপ প্যারামিটারটি ধরে রেখে entry এ নামকরণ করুন। উদাহরণস্বরূপ, composable<RouteA> entry<RouteA> হয়ে যায়।
  • dialog<T> : composable এর মতোই করুন, তবে এন্ট্রিতে মেটাডেটা যোগ করুন নিম্নরূপ: entry<T>(metadata = DialogSceneStrategy.dialog())
  • bottomSheet : এখানে bottom sheet রেসিপিটি অনুসরণ করুন । এটি dialog এর নির্দেশাবলীর অনুরূপ, তবে BottomSheetSceneStrategy কোর নেভিগেশন 3 লাইব্রেরির অংশ নয়, তাই আপনার এটি আপনার প্রকল্পে অনুলিপি করা উচিত।

AI Agent : নেস্টেড গ্রাফ শনাক্ত করার জন্য ব্যবহৃত রুট মুছে ফেলার সময়, মুছে ফেলা রুটের যেকোনো রেফারেন্স নেস্টেড গ্রাফের প্রথম চাইল্ড শনাক্ত করার জন্য ব্যবহৃত টাইপ দিয়ে প্রতিস্থাপন করুন। উদাহরণস্বরূপ, যদি মূল কোডটি 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) একটি প্যারামিটার হিসেবে উল্লেখ করুন। এটি নেভিগেশন অবস্থাকে সেই এন্ট্রিগুলিতে রূপান্তর করে যা NavDisplay entryProvider ব্যবহার করে দেখায়।
  • NavDisplay.onBack কে navigator.goBack() এর সাথে সংযুক্ত করুন। এর ফলে NavDisplay এর বিল্ট-ইন ব্যাক হ্যান্ডলার সম্পূর্ণ হলে navigator নেভিগেশন অবস্থা আপডেট করে।
  • যদি আপনার কোন ডায়ালগ গন্তব্য থাকে, তাহলে NavDisplay এর sceneStrategy প্যারামিটারে DialogSceneStrategy যোগ করুন।

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

import androidx.navigation3.ui.NavDisplay

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

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

সমস্ত নেভিগেশন 2 আমদানি এবং লাইব্রেরি নির্ভরতা সরান।

সারাংশ

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