NavController একটি "ব্যাক স্ট্যাক" ধারণ করে, যেখানে ব্যবহারকারীর পরিদর্শন করা গন্তব্যস্থলগুলো থাকে। ব্যবহারকারী যখন আপনার অ্যাপের বিভিন্ন স্ক্রিনে নেভিগেট করেন, তখন NavController ব্যাক স্ট্যাকে গন্তব্যস্থল যোগ করে এবং সেখান থেকে তা সরিয়ে দেয়।
স্ট্যাক হওয়ার কারণে, ব্যাক স্ট্যাক একটি "লাস্ট ইন, ফার্স্ট আউট" ডেটা স্ট্রাকচার। একারণে NavController স্ট্যাকের শীর্ষে আইটেম পুশ করে এবং সেখান থেকে আইটেম পপ করে।
মৌলিক আচরণ
ব্যাক স্ট্যাকের আচরণ সম্পর্কে এই মূল বিষয়গুলো আপনার বিবেচনা করা উচিত:
- প্রথম গন্তব্য: যখন ব্যবহারকারী অ্যাপটি খোলে, তখন
NavControllerপ্রথম গন্তব্যটিকে ব্যাক স্ট্যাকের শীর্ষে পুশ করে। - স্ট্যাকে পুশ করা: প্রতিবার
NavController.navigate()কল করলে প্রদত্ত গন্তব্যটি স্ট্যাকের শীর্ষে পুশ করা হয়। - শীর্ষ গন্তব্য পপ করা: Up বা Back চাপলে যথাক্রমে
NavController.navigateUp()এবংNavController.popBackStack()মেথডগুলো কল হয়। এগুলো স্ট্যাক থেকে শীর্ষ গন্তব্যটি পপ করে দেয়। Up এবং Back- এর মধ্যে পার্থক্য সম্পর্কে আরও তথ্যের জন্য “নেভিগেশনের নীতিসমূহ” পৃষ্ঠাটি দেখুন।
পপ ব্যাক
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() ফাংশনটি Navigation লাইব্রেরিকে navigate() কলের অংশ হিসেবে ব্যাক স্ট্যাক থেকে কিছু গন্তব্য সরিয়ে ফেলার নির্দেশ দেয়। প্যারামিটারের মান হলো ব্যাক স্ট্যাকে থাকা কোনো গন্তব্যের আইডেন্টিফায়ার। এই আইডেন্টিফায়ারটি একটি পূর্ণসংখ্যা ' id অথবা একটি স্ট্রিং ' route হতে পারে।
আপনি inclusive প্যারামিটারের জন্য true ভ্যালু সহ একটি আর্গুমেন্ট অন্তর্ভুক্ত করতে পারেন, যা নির্দেশ করে যে popUpTo() তে আপনার নির্দিষ্ট করা গন্তব্যটি ব্যাক স্ট্যাক থেকেও পপ অফ হবে।
এটি প্রোগ্রাম্যাটিকভাবে প্রয়োগ করতে, NavOptions এর অংশ হিসেবে navigate() -এ popUpTo() পাস করুন এবং 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 হিসেবে সংজ্ঞায়িত করুন।
এক্সএমএল উদাহরণ
এখানে একটি অ্যাকশন ব্যবহার করে 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"/>
রচনার উদাহরণ
নিচে 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() -এ অপশন পাস করার বিষয়ে সাধারণ তথ্যের জন্য, “ Navigate with options” গাইডটি দেখুন।
ক্রিয়া ব্যবহার করে পপ করুন
কোনো অ্যাকশন ব্যবহার করে নেভিগেট করার সময়, আপনি চাইলে ব্যাক স্ট্যাক থেকে অতিরিক্ত ডেস্টিনেশন পপ করতে পারেন। উদাহরণস্বরূপ, যদি আপনার অ্যাপে একটি প্রাথমিক লগইন ফ্লো থাকে, তবে একজন ব্যবহারকারী লগইন করার পরে, আপনার ব্যাক স্ট্যাক থেকে লগইন-সম্পর্কিত সমস্ত ডেস্টিনেশন পপ করে দেওয়া উচিত, যাতে 'ব্যাক' বাটনটি ব্যবহারকারীদের আবার লগইন ফ্লোতে ফিরিয়ে নিয়ে না যায়।
অতিরিক্ত পঠন
আরও তথ্যের জন্য, নিম্নলিখিত পৃষ্ঠাগুলি পড়ুন:
- বৃত্তাকার নেভিগেশন : জানুন, নেভিগেশন প্রবাহ বৃত্তাকার হলে কীভাবে ব্যাক স্ট্যাক অতিরিক্ত ভরে যাওয়া এড়ানো যায়।
- ডায়ালগ ডেস্টিনেশন : ডায়ালগ ডেস্টিনেশন কীভাবে আপনার ব্যাক স্ট্যাক ব্যবস্থাপনার ক্ষেত্রে স্বতন্ত্র বিবেচ্য বিষয় নিয়ে আসে, সে সম্পর্কে পড়ুন।