নেভিগেশন কম্পোনেন্ট কোনো গন্তব্যে যাওয়ার জন্য একটি সহজ ও সাধারণ উপায় প্রদান করে। এই ইন্টারফেসটি বিভিন্ন ধরনের কনটেক্সট এবং UI ফ্রেমওয়ার্ক সমর্থন করে। উদাহরণস্বরূপ, আপনি কম্পোজ, ভিউ, ফ্র্যাগমেন্ট, অ্যাক্টিভিটি এবং এমনকি কাস্টম UI ফ্রেমওয়ার্কের সাথেও নেভিগেশন কম্পোনেন্টটি ব্যবহার করতে পারেন।
এই নির্দেশিকায় বর্ণনা করা হয়েছে, কীভাবে আপনি বিভিন্ন প্রেক্ষাপটে কোনো গন্তব্যে যাওয়ার জন্য নেভিগেশন কম্পোনেন্ট ব্যবহার করতে পারেন।
একটি নেভকন্ট্রোলার ব্যবহার করুন
গন্তব্যগুলির মধ্যে যাতায়াত করার জন্য আপনি যে প্রধান টাইপটি ব্যবহার করেন তা হলো NavController । ক্লাসটি সম্পর্কে এবং কীভাবে এর একটি ইনস্ট্যান্স তৈরি করতে হয় সে সম্পর্কে আরও তথ্যের জন্য "একটি নেভিগেশন কন্ট্রোলার তৈরি করুন" দেখুন। এই নির্দেশিকাটিতে এটি কীভাবে ব্যবহার করতে হয় তার বিস্তারিত বর্ণনা দেওয়া হয়েছে।
নেভিগেট করুন
আপনি যে UI ফ্রেমওয়ার্কই ব্যবহার করুন না কেন, কোনো গন্তব্যে যাওয়ার জন্য একটিমাত্র ফাংশন রয়েছে: NavController.navigate() ।
navigate() এর জন্য অনেকগুলো ওভারলোড রয়েছে। আপনার নির্দিষ্ট প্রেক্ষাপটের ওপর ভিত্তি করেই ওভারলোডটি বেছে নেওয়া উচিত। উদাহরণস্বরূপ, কোনো কম্পোজেবল-এ নেভিগেট করার জন্য একটি ওভারলোড এবং কোনো ভিউ-তে নেভিগেট করার জন্য অন্যটি ব্যবহার করা উচিত।
নিম্নলিখিত বিভাগগুলিতে navigate() এর কিছু গুরুত্বপূর্ণ ওভারলোডের রূপরেখা দেওয়া হয়েছে যা আপনি ব্যবহার করতে পারেন।
একটি রচনাযোগ্য স্থানে নেভিগেট করুন
একটি কম্পোজেবলে নেভিগেট করার জন্য, আপনার NavController.navigate<T> ব্যবহার করা উচিত। এই ওভারলোডের মাধ্যমে, navigate() একটিমাত্র route আর্গুমেন্ট গ্রহণ করে, যার জন্য আপনাকে একটি type পাস করতে হয়। এটি গন্তব্যের চাবি হিসেবে কাজ করে।
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
ন্যাভিগেশন গ্রাফে কোনো কম্পোজেবলে নেভিগেট করতে, প্রথমে আপনার NavGraph এমনভাবে সংজ্ঞায়িত করুন যাতে প্রতিটি গন্তব্য একটি টাইপের সাথে সঙ্গতিপূর্ণ হয় । কম্পোজেবলের ক্ষেত্রে, আপনি composable() ফাংশনটি ব্যবহার করে এটি করে থাকেন।
আপনার কম্পোজেবল থেকে ইভেন্টগুলি প্রকাশ করুন
যখন কোনো কম্পোজেবল ফাংশনকে একটি নতুন স্ক্রিনে নেভিগেট করার প্রয়োজন হয়, তখন সরাসরি navigate() কল করার জন্য এটিকে NavController এর রেফারেন্স দেওয়া উচিত নয়। ইউনিডিরেকশনাল ডেটা ফ্লো (UDF) নীতি অনুসারে, এর পরিবর্তে কম্পোজেবলটির এমন একটি ইভেন্ট প্রকাশ করা উচিত যা NavController হ্যান্ডেল করে।
আরও সরাসরি বলতে গেলে, আপনার কম্পোজেবল-এ () -> Unit টাইপের একটি প্যারামিটার থাকা উচিত। যখন আপনি composable() ফাংশন ব্যবহার করে আপনার NavHost এ ডেস্টিনেশন যোগ করবেন, তখন আপনার কম্পোজেবল-কে NavController.navigate() -এ একটি কল পাস করুন।
এর একটি উদাহরণের জন্য নিম্নলিখিত উপবিভাগটি দেখুন।
উদাহরণ
পূর্ববর্তী বিভাগগুলোর দৃষ্টান্তস্বরূপ, নিচের অংশবিশেষে এই বিষয়গুলো লক্ষ্য করুন:
- গ্রাফের প্রতিটি গন্তব্য একটি রুট ব্যবহার করে তৈরি করা হয়, যা হলো একটি সিরিয়ালাইজেবল অবজেক্ট বা ক্লাস এবং যা সেই গন্তব্যের জন্য প্রয়োজনীয় ডেটা বর্ণনা করে।
-
MyAppNavHostকম্পোজেবলটিNavControllerইনস্ট্যান্সটিকে ধারণ করে। - সেই অনুযায়ী,
navigate()কলগুলো সেখানেই হওয়া উচিত,ProfileScreenমতো কোনো নিম্নস্তরের কম্পোজেবলে নয়। -
ProfileScreenএকটি বাটন রয়েছে, যেটি ক্লিক করলে ব্যবহারকারীকেFriendsListনিয়ে যায়। তবে, এটি নিজেnavigate()কল করে না। - এর পরিবর্তে, বাটনটি এমন একটি ফাংশনকে কল করে যা
onNavigateToFriendsপ্যারামিটার হিসেবে প্রকাশিত হয়। - যখন
MyAppNavHostনেভিগেশন গ্রাফেProfileScreenযোগ করে, তখনonNavigateToFriendsজন্য এটি একটি ল্যাম্বডা পাস করে যাnavigate(route = FriendsList) কল করে। - এটি নিশ্চিত করে যে যখন ব্যবহারকারী
ProfileScreenবোতামটি চাপেন, তখন তিনি সঠিকভাবেFriendsListScreenএ চলে যান।
@Serializable
object Profile
@Serializable
object FriendsList
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = Profile
) {
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
composable<FriendsList> { FriendsListScreen(/*...*/) }
}
}
@Composable
fun ProfileScreen(
onNavigateToFriends: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToFriends) {
Text(text = "See friends list")
}
}
পূর্ণসংখ্যা আইডি ব্যবহার করে নেভিগেট করুন
একটি ইন্টিজার আইডি ব্যবহার করে কোনো গন্তব্যে নেভিগেট করতে, navigate(int) ওভারলোডটি কল করুন। এটি কোনো অ্যাকশন বা গন্তব্যের রিসোর্স আইডি গ্রহণ করে। নিচের কোড স্নিপেটটি দেখায় কিভাবে আপনি এই ওভারলোডটি ব্যবহার করে ViewTransactionsFragment এ নেভিগেট করতে পারেন:
কোটলিন
viewTransactionsButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.viewTransactionsAction)
}
জাভা
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
}
});
আইডি ব্যবহার করে নেভিগেট করার সময়, যেখানে সম্ভব অ্যাকশন ব্যবহার করা উচিত। অ্যাকশনগুলো আপনার নেভিগেশন গ্রাফে অতিরিক্ত তথ্য প্রদান করে, যা দৃশ্যমানভাবে দেখায় আপনার গন্তব্যস্থলগুলো একে অপরের সাথে কীভাবে সংযুক্ত।
NavDeepLinkRequest ব্যবহার করে নেভিগেট করুন
একটি ইমপ্লিসিট ডিপ লিঙ্ক গন্তব্যে নেভিগেট করতে, navigate(NavDeepLinkRequest) ওভারলোডটি ব্যবহার করুন। নিম্নলিখিত কোড স্নিপেটটি এই মেথডটির একটি ইমপ্লিমেন্টেশন প্রদান করে:
কোটলিন
val request = NavDeepLinkRequest.Builder
.fromUri("android-app://androidx.navigation.app/profile".toUri())
.build()
findNavController().navigate(request)
জাভা
NavDeepLinkRequest request = NavDeepLinkRequest.Builder
.fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
.build()
NavHostFragment.findNavController(this).navigate(request)
অ্যাকশন বা ডেস্টিনেশন আইডি ব্যবহার করে নেভিগেশনের বিপরীতে, আপনি আপনার গ্রাফের যেকোনো ডিপ লিঙ্কে নেভিগেট করতে পারেন, গন্তব্যটি দৃশ্যমান হোক বা না হোক। আপনি বর্তমান গ্রাফের কোনো গন্তব্যে অথবা সম্পূর্ণ ভিন্ন কোনো গ্রাফের গন্তব্যেও নেভিগেট করতে পারেন।
ক্রিয়া এবং MIME প্রকার
Uri ছাড়াও, NavDeepLinkRequest অ্যাকশন এবং MIME টাইপ সহ ডিপ লিঙ্কও সমর্থন করে। অনুরোধে একটি অ্যাকশন যোগ করতে, fromAction() বা setAction() ব্যবহার করুন। অনুরোধে একটি MIME টাইপ যোগ করতে, fromMimeType() বা setMimeType() ব্যবহার করুন।
একটি NavDeepLinkRequest কোনো ইমপ্লিসিট ডিপ লিঙ্ক ডেস্টিনেশনের সাথে সঠিকভাবে মেলানোর জন্য, URI, অ্যাকশন এবং MIME টাইপ—এই তিনটিকেই ডেস্টিনেশনের NavDeepLink এর সাথে মিলতে হবে। URI-গুলোকে অবশ্যই প্যাটার্নের সাথে মিলতে হবে, অ্যাকশনগুলো হুবহু মিলতে হবে এবং MIME টাইপগুলো সম্পর্কিত হতে হবে। উদাহরণস্বরূপ, image/jpg এর সাথে image/\* মেলে।
আরও প্রসঙ্গ
এই ডকুমেন্টে NavController.navigate() ফাংশনটির সবচেয়ে প্রচলিত ব্যবহারগুলো আলোচনা করা হয়েছে। তবে, এই ফাংশনটির বিভিন্ন ওভারলোড রয়েছে যা আপনি ভিন্ন ভিন্ন প্রেক্ষাপটে এবং যেকোনো Ui ফ্রেমওয়ার্কের সাথে একত্রে ব্যবহার করতে পারেন। এই ওভারলোডগুলো সম্পর্কে আরও বিস্তারিত জানতে রেফারেন্স ডকুমেন্টেশন দেখুন।
আরও পড়ুন
আরও তথ্যের জন্য, নিম্নলিখিত পৃষ্ঠাগুলি দেখুন:
- একটি নেভিগেশন কন্ট্রোলার তৈরি করুন
- নেভিগেশন এবং ব্যাক স্ট্যাক
- বিকল্পগুলির সাহায্যে নেভিগেট করুন
- Kotlin DSL এবং Navigation Compose-এ টাইপ সুরক্ষা