নেভিগেশন ও ব্যাক স্ট্যাক

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() -এ কল করতে হবে। নিম্নলিখিত স্নিপেট এটি দেখায়:

kotlin

...

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

java

...

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

কোনও গন্তব্যে পপ-আপ করুন

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

আপনি inclusive প্যারামিটারের জন্য true ভ্যালু সহ একটি আর্গুমেন্ট যোগ করতে পারেন যাতে বোঝা যায় যে popUpTo()-এ আপনার উল্লেখ করা গন্তব্যও ব্যাক স্ট্যাক থেকে পপ অফ করা উচিত।

প্রোগ্রাম্যাটিক্যালি এটি প্রয়োগ করতে, popUpTo() থেকে navigate()-এ পাস করুন, এটি NavOptions-এর অংশ হিসেবে inclusive-কে true-এ সেট করে। এটি Compose ও Views, দুটিতেই কাজ করে।

পপ-আপ করার সময় স্ট্যাটাস সেভ করুন

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

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

এছাড়াও, আপনি নেভিগেশন বিকল্পে restoreState = true নির্দিষ্ট করতে পারেন যাতে ব্যাক স্ট্যাক এবং গন্তব্যের সাথে সম্পর্কিত স্ট্যাটাস অটোমেটিক রিস্টোর করা যায়।

যেমন:

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

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

কম্পোজের উদাহরণ

Compose-এ একই বিষয়ের সম্পূর্ণ উদাহরণ নিচে দেওয়া হল:

@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()-এ বিকল্প পাস করার বিষয়ে সাধারণ তথ্যের জন্য, বিকল্প সহ নেভিগেট করার নির্দেশিকা দেখুন।

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"/>

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

কোনও অ্যাকশন ব্যবহার করে নেভিগেট করার সময়, আপনি বিকল্প হিসেবে ব্যাক স্ট্যাক থেকে অতিরিক্ত গন্তব্য পপ করতে পারবেন। যেমন, আপনার অ্যাপে যদি প্রাথমিক লগ-ইন ফ্লো থাকে, তাহলে ব্যবহারকারী লগ-ইন করার পরে, আপনাকে লগ-ইন সম্পর্কিত সব ডেস্টিনেশন ব্যাক স্ট্যাক থেকে পপ-অফ করতে হবে যাতে 'ফিরে যান' বোতাম ব্যবহারকারীকে আবার লগ-ইন ফ্লোতে নিয়ে না যায়।

অতিরিক্ত রিডিং

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

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