নেভিগেশন 3

Jetpack Compose-এর জন্য সম্পূর্ণ নতুনভাবে ডিজাইন করা নেভিগেশন লাইব্রেরি হল Navigation 3। Wear OS অ্যাপ্লিকেশনে কীভাবে নেভিগেশন ৩ প্রয়োগ করতে হয় তা এই নির্দেশিকা থেকে জানতে পারবেন।

মূল ধারণা

  • NavKey: আপনার অ্যাপে গন্তব্যের (স্ক্রিন) জন্য টাইপ-সেফ, সিরিয়ালাইজেবল শনাক্তকারী ।
  • NavBackStack: NavKey ইনস্ট্যান্সের একটি পরিবর্তনযোগ্য তালিকা যা নেভিগেশন ইতিহাসকে উপস্থাপন করে। আপনি এই তালিকা থেকে সরাসরি আইটেম পুশ ও পপ করেন।
  • rememberNavBackStack: একটি কম্পোজ করার উপযুক্ত আইটেম যা কনফিগারেশন পরিবর্তন ও প্রসেস ডেথ জুড়ে ব্যাক স্ট্যাক তৈরি ও বজায় রাখে।
  • NavDisplay: ব্যাক স্ট্যাক পর্যবেক্ষণ করে এবং অ্যাক্টিভ স্ক্রিন রেন্ডার করে এমন মূল UI কম্পোনেন্ট।
  • EntryProvider: একটি ম্যাপিং DSL যা NavKey-কে এর আসল @Composable UI-এর সাথে লিঙ্ক করে।
  • 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 মুছে যায়।

  1. ডিপেন্ডেন্সি যোগ করুন:

    implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")
    
  2. আপনার NavDisplay-এ entryDecorators ViewModel স্টোর ডেকোরেটর যোগ করুন। এছাড়াও, Compose rememberSaveable স্টেট বজায় রাখতে কাস্টম ডেকরেটর প্রদান করার সময় আপনাকে অবশ্যই 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()
            }
        }
    )