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

নেভিগেশন ৩, জেটপ্যাক কম্পোজ যেভাবে নেভিগেশন স্টেট পরিচালনা করে তাতে একটি মৌলিক পরিবর্তন এনেছে এবং নেভিগেশন ২-এর তুলনায় উল্লেখযোগ্য স্থাপত্যগত সুবিধা প্রদান করে।

একটি Wear Compose অ্যাপকে Navigation 2 থেকে Navigation 3-এ মাইগ্রেট করার জন্য প্রয়োজনীয় স্থাপত্যগত পরিবর্তন এবং ধাপগুলো বুঝুন।

নেভিগেশন ৩ এর প্রধান সুবিধাসমূহ

  • সরাসরি ব্যাক স্ট্যাক নিয়ন্ত্রণ : NavBackStack মূলত NavKey অবজেক্টের একটি পরিবর্তনযোগ্য তালিকা, যা ব্যবহারকারীর দেখা স্ক্রিনগুলোর ইতিহাস উপস্থাপন করে। আপনি এটিকে যেকোনো Kotlin MutableList মতোই নিয়ন্ত্রণ করতে পারেন ( add , removeLast , clear )। নেভিগেশন অ্যাকশন সম্পাদন করার জন্য আপনি সরাসরি তালিকাটি ব্যবহার করতে পারেন, যেমন সামনে যাওয়ার জন্য একটি কী যোগ করা বা পিছনে যাওয়ার জন্য একটি কী মুছে ফেলা।
  • কম্পোজ-ফার্স্ট ডিজাইন : ব্যাক স্ট্যাককে স্ট্যান্ডার্ড অবজার্ভেবল স্টেট হিসেবে মডেল করা হয়। আপনার নেভিগেশন হিস্ট্রি পরিবর্তন করলে তা অন্য যেকোনো কম্পোজ স্টেট আপডেট করার মতোই কাজ করে এবং বর্তমান স্ক্রিনটি দেখানোর জন্য স্বয়ংক্রিয়ভাবে রিকম্পোজিশন শুরু করে।
  • ডিফল্টরূপে টাইপ-সেফ : স্ট্রিং-ভিত্তিক রুট সম্পূর্ণরূপে বাদ দেওয়া হয়েছে। নেভিগেশনের জন্য সিরিয়ালাইজেবল ডেটা অবজেক্ট এবং ডেটা ক্লাস ব্যবহার করা হয়।
  • বিচ্ছিন্ন উপস্থাপনা (সিন স্ট্র্যাটেজি) : UI ট্রানজিশন লেয়ার ( NavDisplay এবং SwipeDismissableSceneStrategy ) স্টেট ট্র্যাকিং ( NavBackStack ) থেকে সম্পূর্ণরূপে পৃথক রাখা হয়েছে, যা Wear OS-এর বিল্ট-ইন ন্যাভিগেশন ট্রানজিশনগুলোর সহজতর ইন্টিগ্রেশন সম্ভব করে তোলে।

অভিবাসনের পদক্ষেপ

১. নির্ভরতা আপডেট করুন

পুরানো androidx.wear.compose:compose-navigation ডিপেন্ডেন্সিটি সরিয়ে দিন এবং কোটলিন সিরিয়ালাইজেশন সাপোর্ট সহ নতুন স্প্লিট নেভিগেশন ৩ ডিপেন্ডেন্সিগুলো যুক্ত করুন।

অপসারণ করুন:

implementation("androidx.wear.compose:compose-navigation:...")

যোগ করুন:

implementation("androidx.navigation3:navigation3-runtime:...") // State logic
implementation("androidx.navigation3:navigation3-ui:...")      // Display logic
implementation("androidx.wear.compose:compose-navigation3:...") // Wear gestures
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:...") // Requires compiler plugin

২. NavKey বাস্তবায়নের জন্য গন্তব্যস্থলগুলো হালনাগাদ করুন।

নেভিগেশন ২-এ, আপনি রাউটিংয়ের জন্য স্ট্রিং বা জেনেরিক অবজেক্ট ব্যবহার করে থাকতে পারেন। নেভিগেশন ৩-এ, আপনাকে অবশ্যই NavKey মার্কার ইন্টারফেসটি ইমপ্লিমেন্ট করতে হবে এবং প্রতিটি স্ক্রিন অবজেক্টকে @Serializable দিয়ে অ্যানোটেট করতে হবে।

এর প্রয়োজন কেন? প্রসেস বন্ধ হয়ে যাওয়ার পরেও যেন ব্যাক স্ট্যাক সংরক্ষণ ও পুনরুদ্ধার করা যায়, তা নিশ্চিত করতে অন্তর্নিহিত navigation3-runtime স্টেটকে সিরিয়ালাইজ করার জন্য kotlinx-serialization উপর নির্ভর করে।

পূর্বে (নেভিগেশন ২ - জেনেরিক টাইপ-সেফ রুট):

sealed class Nav2Screen {
    data object Landing : Nav2Screen()
    data object List : Nav2Screen()
}

পরে (নেভিগেশন ৩ - নেভকি + সিরিয়ালাইজেবল):

@Serializable
sealed interface MigrationScreen : NavKey {
    @Serializable
    data object Landing : MigrationScreen

    @Serializable
    data object List : MigrationScreen
}

৩. রাউটিং লজিক প্রতিস্থাপন করুন ( NavController থেকে NavBackStack )

আপনার NavController rememberNavBackStack এর মাধ্যমে ইনিশিয়ালাইজ করা একটি NavBackStack দিয়ে প্রতিস্থাপন করুন। এছাড়াও, Wear OS-এর জন্য বিশেষভাবে SwipeDismissableSceneStrategy টি ইনস্ট্যানশিয়েট করতে হবে।

পূর্বে (নেভিগেশন ২):

val navController = rememberSwipeDismissableNavController()

পরে (নেভিগেশন ৩):

val backStack = rememberNavBackStack(MigrationScreen.Landing as NavKey)
val strategy = rememberSwipeDismissableSceneStrategy<NavKey>()

৪. NavHost NavDisplay এবং entryProvider DSL দ্বারা প্রতিস্থাপন করুন।

NavHost কন্টেইনার এবং এর অভ্যন্তরীণ composable("route") { ... } বিল্ডার DSL-কে NavDisplay এবং entryProvider { entry<Key> { ... } } DSL দ্বারা প্রতিস্থাপন করা হয়েছে।

পূর্বে (নেভিগেশন ২):

SwipeDismissableNavHost(navController = navController, startDestination = "menu") {
    composable("menu") {
        GreetingScreen(
            onShowList = { navController.navigate("list") }
        )
    }
    composable("list") {
        ListScreen()
    }
}

পরে (নেভিগেশন ৩):

NavDisplay(
    backStack = backStack,
    sceneStrategies = listOf(strategy),
    entryProvider = entryProvider {
        entry<MigrationScreen.Landing> {
            GreetingScreen(
                onShowList = { backStack.add(MigrationScreen.List) }
            )
        }
        entry<MigrationScreen.List> {
            ListScreen()
        }
    }
)