নেভিগেশন 3

নেভিগেশন ৩ হলো জেটপ্যাক কম্পোজের জন্য একেবারে গোড়া থেকে ডিজাইন করা একটি নেভিগেশন লাইব্রেরি। এই নির্দেশিকায় ব্যাখ্যা করা হয়েছে কীভাবে Wear OS অ্যাপ্লিকেশনগুলিতে নেভিগেশন ৩ প্রয়োগ করতে হয়।

মূল ধারণা

  • NavKey : আপনার অ্যাপের কোনো গন্তব্য (স্ক্রিন)-এর জন্য একটি টাইপ-সেফ ও সিরিয়ালাইজেবল আইডেন্টিফায়ার।
  • NavBackStack : নেভিগেশন ইতিহাস উপস্থাপনকারী NavKey ইনস্ট্যান্সগুলোর একটি পরিবর্তনযোগ্য তালিকা। আপনি সরাসরি এই তালিকা থেকে আইটেম পুশ এবং পপ করতে পারেন।
  • rememberNavBackStack : একটি কম্পোজেবল যা কনফিগারেশন পরিবর্তন এবং প্রসেস বন্ধ হয়ে যাওয়ার পরেও ব্যাক স্ট্যাক তৈরি করে এবং তা বজায় রাখে।
  • NavDisplay : মূল UI কম্পোনেন্ট যা ব্যাক স্ট্যাক পর্যবেক্ষণ করে এবং সক্রিয় স্ক্রিনটি রেন্ডার করে।
  • EntryProvider : একটি ম্যাপিং ডিএসএল যা একটি NavKey কে তার প্রকৃত @Composable UI-এর সাথে সংযুক্ত করে।
  • SwipeDismissableSceneStrategy : এটি Wear-এর নিজস্ব স্ট্র্যাটেজি যা আপনার স্ক্রিনগুলোকে একটি সোয়াইপ-টু-ডিসমিস জেসচারের আওতায় আনে এবং বিল্ট-ইন ব্যাক অ্যানিমেশনগুলো পরিচালনা করে।

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

আপনার প্রজেক্টে প্রয়োজনীয় Navigation 3, Wear Compose, এবং Serialization ডিপেন্ডেন্সিগুলো যোগ করুন।

গ্রুভি

dependencies {
    // Core Navigation 3 APIs
    implementation "androidx.navigation3:navigation3-runtime:1.2.0-alpha02"
    implementation "androidx.navigation3:navigation3-ui:1.2.0-alpha02"

    // Wear OS specific Navigation 3 integration
    implementation "androidx.wear.compose:compose-navigation3:1.6.1"

    // Kotlinx Serialization for type-safe routing
    implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0"
}

কোটলিন

dependencies {
    // Core Navigation 3 APIs
    implementation("androidx.navigation3:navigation3-runtime:1.2.0-alpha02")
    implementation("androidx.navigation3:navigation3-ui:1.2.0-alpha02")

    // Wear OS specific Navigation 3 integration
    implementation("androidx.wear.compose:compose-navigation3:1.6.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 গুলো Activity এর স্কোপের মধ্যে থাকে। Navigation 3 একটি নির্দিষ্ট আর্টিফ্যাক্ট ( lifecycle-viewmodel-navigation3 ) প্রদান করে, যার মাধ্যমে একটি ViewModel কে ব্যাক স্ট্যাকের কোনো NavEntry এর মধ্যে নিরাপদে স্কোপ করা যায়। যখন ব্যাক স্ট্যাক থেকে গন্তব্যটি পপ করে সরিয়ে ফেলা হয়, তখন ViewModel-টি ক্লিয়ার হয়ে যায়।

  1. নির্ভরতা যোগ করুন:

    implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")
    
  2. আপনার NavDisplay এর entryDecorators এ ViewModel store ডেকোরেটরটি যোগ করুন। 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()
            }
        }
    )