নেভিগেশন এবং পিছনে স্ট্যাক

NavController একটি "ব্যাক স্ট্যাক" ধারণ করে যাতে ব্যবহারকারীর পরিদর্শন করা গন্তব্যগুলি থাকে৷ ব্যবহারকারী আপনার অ্যাপ জুড়ে স্ক্রীনে নেভিগেট করার সাথে সাথে, NavController পিছনের স্ট্যাকে এবং থেকে গন্তব্য যোগ করে এবং সরিয়ে দেয়।

স্ট্যাক হওয়ার ক্ষেত্রে, ব্যাক স্ট্যাক একটি "লাস্ট ইন, ফার্স্ট আউট" ডেটা স্ট্রাকচার। তাই NavController আইটেমগুলিকে ধাক্কা দেয় এবং স্ট্যাকের উপরে থেকে আইটেমগুলিকে পপ করে।

মৌলিক আচরণ

ব্যাক স্ট্যাকের আচরণ সম্পর্কে আপনার বিবেচনা করা উচিত এই মূল তথ্য:

  • প্রথম গন্তব্য: ব্যবহারকারী অ্যাপটি খুললে, NavController প্রথম গন্তব্যটিকে পিছনের স্ট্যাকের শীর্ষে ঠেলে দেয়।
  • স্ট্যাকের দিকে ঠেলে দেওয়া: প্রতিটি কল NavController.navigate() প্রদত্ত গন্তব্যটিকে স্ট্যাকের শীর্ষে ঠেলে দেয়।
  • পপিং শীর্ষ গন্তব্য: উপরে বা পিছনে ট্যাপ করা যথাক্রমে NavController.navigateUp() এবং NavController.popBackStack() পদ্ধতিগুলিকে কল করে৷ তারা স্ট্যাক বন্ধ শীর্ষ গন্তব্য পপ. আপ এবং ব্যাক এর মধ্যে পার্থক্য সম্পর্কে আরও তথ্যের জন্য নেভিগেশনের নীতিগুলি দেখুন।

পপ ব্যাক

NavController.popBackStack() পদ্ধতি ব্যাক স্ট্যাকের থেকে বর্তমান গন্তব্যটি পপ করার চেষ্টা করে এবং পূর্ববর্তী গন্তব্যে নেভিগেট করে। এটি কার্যকরভাবে ব্যবহারকারীকে তাদের নেভিগেশন ইতিহাসে এক ধাপ পিছিয়ে নিয়ে যায়। এটি একটি বুলিয়ান ফেরত দেয় যা নির্দেশ করে যে এটি সফলভাবে গন্তব্যে ফিরে এসেছে কিনা।

একটি নির্দিষ্ট গন্তব্যে ফিরে যান

আপনি একটি নির্দিষ্ট গন্তব্যে নেভিগেট করতে popBackStack() ব্যবহার করতে পারেন। এটি করার জন্য, এর ওভারলোডগুলির একটি ব্যবহার করুন। অনেকগুলি রয়েছে যা আপনাকে একটি শনাক্তকারীতে পাস করার অনুমতি দেয়, যেমন একটি পূর্ণসংখ্যা id বা একটি স্ট্রিং route ৷ এই ওভারলোডগুলি ব্যবহারকারীকে প্রদত্ত শনাক্তকারীর সাথে যুক্ত গন্তব্যে নিয়ে যায়। সমালোচনামূলকভাবে, তারা সেই গন্তব্যের উপরে স্ট্যাকের সমস্ত কিছু পপ করে।

এই ওভারলোডগুলিও একটি inclusive বুলিয়ান নেয়। এটি নির্ধারণ করে যে নেভিগেট করার পরে NavController নির্দিষ্ট গন্তব্যটি ব্যাক স্ট্যাকের থেকে পপ করবে কিনা।

একটি উদাহরণের জন্য এই সংক্ষিপ্ত স্নিপেট বিবেচনা করুন:

navController.popBackStack(R.id.destinationId, true)

এখানে NavController পূর্ণসংখ্যা আইডি destinationId দিয়ে গন্তব্যে ফিরে আসে। inclusive আর্গুমেন্টের মান true হওয়ায়, NavController পিছনের স্ট্যাক থেকে প্রদত্ত গন্তব্যকে পপ করে।

একটি ব্যর্থ পপ ফিরে হ্যান্ডেল

যখন popBackStack() false রিটার্ন করে, পরবর্তীকালে NavController.getCurrentDestination() -এ একটি কল null রিটার্ন করে। এর মানে অ্যাপটি ব্যাক স্ট্যাকের থেকে শেষ গন্তব্যটি পপ করেছে। এই ক্ষেত্রে, ব্যবহারকারী শুধুমাত্র একটি ফাঁকা স্ক্রীন দেখেন।

এটি নিম্নলিখিত ক্ষেত্রে ঘটতে পারে:

  • popBackStack() স্ট্যাক থেকে কিছু পপ করেনি।
  • popBackStack() ব্যাক স্ট্যাক থেকে একটি গন্তব্য পপ করেছে এবং স্ট্যাকটি এখন খালি।

এটি সমাধান করতে, আপনাকে অবশ্যই একটি নতুন গন্তব্যে নেভিগেট করতে হবে বা এটি শেষ করতে আপনার কার্যকলাপে finish() কল করতে হবে। নিম্নলিখিত স্নিপেট এটি প্রদর্শন করে:

কোটলিন

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish()
}

জাভা

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish();
}

একটি গন্তব্যে পপ আপ

এক গন্তব্য থেকে অন্য গন্তব্যে নেভিগেট করার সময় পিছনের স্ট্যাক থেকে গন্তব্যগুলি সরাতে, সংশ্লিষ্ট navigate() ফাংশন কলে একটি popUpTo() আর্গুমেন্ট যোগ করুন। popUpTo() navigate() করার কলের অংশ হিসাবে নেভিগেশন লাইব্রেরীকে পিছনের স্ট্যাক থেকে কিছু গন্তব্য সরিয়ে দেওয়ার নির্দেশ দেয়। প্যারামিটার মান হল পিছনের স্ট্যাকের একটি গন্তব্যের শনাক্তকারী। শনাক্তকারী একটি পূর্ণসংখ্যা id বা স্ট্রিং route হতে পারে।

আপনি popUpTo() এ যে গন্তব্যটি নির্দিষ্ট করেছেন সেটিকেও ব্যাক স্ট্যাকের পপ অফ করা উচিত তা নির্দেশ করার জন্য আপনি true মান সহ inclusive প্যারামিটারের জন্য একটি যুক্তি অন্তর্ভুক্ত করতে পারেন।

এটিকে প্রোগ্রাম্যাটিকভাবে বাস্তবায়ন করতে, navigate() করতে popUpTo() পাস করুন যাতে NavOptions সেট true হয় inclusive এটি রচনা এবং দৃশ্য উভয় ক্ষেত্রেই কাজ করে।

পপ আপ যখন অবস্থা সংরক্ষণ করুন

যখন আপনি একটি গন্তব্যে নেভিগেট করার জন্য popUpTo ব্যবহার করেন, তখন আপনি ঐচ্ছিকভাবে ব্যাক স্ট্যাকটি সংরক্ষণ করতে পারেন এবং সমস্ত গন্তব্যের স্টেটগুলি ব্যাক স্ট্যাক থেকে পপ করা হয়। পরবর্তী সময়ে সেই গন্তব্যে নেভিগেট করার সময় আপনি ব্যাক স্ট্যাক এবং গন্তব্যগুলি পুনরুদ্ধার করতে পারেন। এটি আপনাকে একটি নির্দিষ্ট গন্তব্যের জন্য স্থিতি সংরক্ষণ করতে এবং একাধিক ব্যাক স্ট্যাক থাকতে দেয়।

প্রোগ্রামগতভাবে এটি করতে, আপনার নেভিগেশন বিকল্পগুলিতে popUpTo যোগ করার সময় saveState = true উল্লেখ করুন।

ব্যাক স্ট্যাক এবং গন্তব্যের সাথে যুক্ত অবস্থা স্বয়ংক্রিয়ভাবে পুনরুদ্ধার করতে আপনি আপনার নেভিগেশন বিকল্পগুলিতে restoreState = true উল্লেখ করতে পারেন।

যেমন:

navController.navigate(
    route = route,
    navOptions =  navOptions {
        popUpTo<A>{ saveState = true }
        restoreState = true
    }
)

XML-এ সেভিং এবং রিস্টোরিং স্টেট সক্ষম করতে, সংশ্লিষ্ট action popUpToSaveState যথাক্রমে true এবং restoreState true হিসেবে সংজ্ঞায়িত করুন।

XML উদাহরণ

এখানে একটি ক্রিয়া ব্যবহার করে XML-এ popUpTo এর একটি উদাহরণ রয়েছে:

<action
  android:id="@+id/action_a_to_b"
  app:destination="@id/b"
  app:popUpTo="@+id/a"
  app:popUpToInclusive="true"
  app:restoreState=”true”
  app:popUpToSaveState="true"/>

উদাহরণ রচনা করুন

নিম্নে কম্পোজে এর একটি সম্পূর্ণ উদাহরণ দেওয়া হল:

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: Any = A
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable<A> {
            DestinationA(
                onNavigateToB = {
                // Pop everything up to, and including, the A destination off
                // the back stack, saving the back stack and the state of its
                // destinations.
                // Then restore any previous back stack state associated with
                // the B destination.
                // Finally navigate to the B destination.
                    navController.navigate(route = B) {
                        popUpTo<A> {
                            inclusive = true
                            saveState = true
                        }
                        restoreState = true
                    }
                },
            )
        }
        composable<B> { DestinationB(/* ... */) }
    }
}

@Composable
fun DestinationA(onNavigateToB: () -> Unit) {
    Button(onClick = onNavigateToB) {
        Text("Go to A")
    }
}

আরও বিস্তারিতভাবে, আপনি নিম্নলিখিত উপায়ে NavController.navigate() কল করার পদ্ধতি পরিবর্তন করতে পারেন:

// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a")
}

// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a") { inclusive = true }
}

// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
    launchSingleTop = true
}

NavController.navigate() এ বিকল্পগুলি পাস করার বিষয়ে সাধারণ তথ্যের জন্য, বিকল্প নির্দেশিকা সহ নেভিগেট দেখুন।

অ্যাকশন ব্যবহার করে পপ করুন

একটি ক্রিয়া ব্যবহার করে নেভিগেট করার সময়, আপনি বিকল্পভাবে ব্যাক স্ট্যাকের বাইরে অতিরিক্ত গন্তব্যগুলি পপ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার অ্যাপের একটি প্রাথমিক লগইন প্রবাহ থাকে, একবার ব্যবহারকারী লগইন করলে, আপনাকে ব্যাক স্ট্যাকের থেকে লগইন-সম্পর্কিত সমস্ত গন্তব্যগুলি পপ করা উচিত যাতে ব্যাক বোতাম ব্যবহারকারীদের লগইন প্রবাহে ফিরিয়ে না নেয়।

অতিরিক্ত পড়া

আরও তথ্যের জন্য, নিম্নলিখিত পৃষ্ঠাগুলি পড়ুন:

  • বৃত্তাকার নেভিগেশন : যেখানে নেভিগেশন প্রবাহ বৃত্তাকার হয় সেক্ষেত্রে আপনি কীভাবে একটি ওভারস্টাফড ব্যাক স্ট্যাক এড়াতে পারেন তা জানুন।
  • ডায়ালগ গন্তব্য : আপনি কীভাবে আপনার ব্যাক স্ট্যাক পরিচালনা করেন তার জন্য ডায়ালগ গন্তব্যগুলি কীভাবে অনন্য বিবেচনার পরিচয় দেয় সে সম্পর্কে পড়ুন।