কোনও গন্তব্যে নেভিগেট করা

নেভিগেশন কম্পোনেন্ট কোনও গন্তব্যে নেভিগেট করার জন্য একটি সহজ এবং সাধারণ উপায় প্রদান করে। এই ইন্টারফেস বিভিন্ন ধরনের প্রসঙ্গ ও UI ফ্রেমওয়ার্ক সাপোর্ট করে। যেমন, আপনি Compose, ভিউ, ফ্র্যাগমেন্ট, অ্যাক্টিভিটি এবং এমনকি কাস্টম UI ফ্রেমওয়ার্কের সাথে নেভিগেশন কম্পোনেন্ট ব্যবহার করতে পারবেন।

এই নির্দেশিকা থেকে আপনি জানতে পারবেন যে বিভিন্ন পরিস্থিতিতে কোনও গন্তব্যে নেভিগেট করার জন্য কীভাবে নেভিগেশন কম্পোনেন্ট ব্যবহার করতে হয়।

NavController ব্যবহার করা

এক গন্তব্য থেকে অন্য গন্তব্যে যাওয়ার জন্য আপনি যে ধরনের 'কী' ব্যবহার করেন তা হল NavController। ক্লাস এবং কীভাবে এর ইনস্ট্যান্স তৈরি করতে হয় সেই সম্পর্কে আরও তথ্যের জন্য নেভিগেশন কন্ট্রোলার তৈরি করুন দেখুন। এই নির্দেশিকায় এটি কীভাবে ব্যবহার করতে হয় তার বিবরণ দেওয়া আছে।

আপনি যে UI ফ্রেমওয়ার্কই ব্যবহার করুন না কেন, গন্তব্যে নেভিগেট করার জন্য আপনি একটিই ফাংশন ব্যবহার করতে পারবেন: NavController.navigate()।

navigate()-এর জন্য অনেক ওভারলোড উপলভ্য। আপনার সঠিক প্রসঙ্গের সাথে মিল রেখে ওভারলোড বেছে নিতে হবে। যেমন, কম্পোজেবলে নেভিগেট করার সময় একটি ওভারলোড এবং ভিউতে নেভিগেট করার সময় আরেকটি ওভারলোড ব্যবহার করা উচিত।

নিম্নলিখিত বিভাগগুলি কিছু মূল navigate() ওভারলোডকে আউটলাইন করে যা আপনি ব্যবহার করতে পারেন।

কম্পোজেবলে নেভিগেট করুন

কম্পোজেবলে নেভিগেট করতে, আপনাকে NavController.navigate<T> ব্যবহার করতে হবে। এই ওভারলোডের সাথে, navigate() একটি একক route আর্গুমেন্ট নেয় যার জন্য আপনি একটি ধরন পাস করেন। এটি গন্তব্যের 'কী' হিসেবে কাজ করে।

@Serializable
object FriendsList

navController.navigate(route = FriendsList)

নেভিগেশন গ্রাফে কম্পোজেবলে নেভিগেট করতে, প্রথমে আপনার NavGraph এমনভাবে সংজ্ঞায়িত করুন যাতে প্রতিটি গন্তব্য একটি প্রকারের সাথে মিলে যায়। composables-এর জন্য, আপনি composable() ফাংশনের মাধ্যমে এটি করেন।

আপনার কম্পোজেবল থেকে ইভেন্ট এক্সপোজ করুন

কোনও কম্পোজেবল ফাংশনকে নতুন স্ক্রিনে নেভিগেট করতে হলে, আপনি সেটিকে NavController-এর রেফারেন্স পাস করবেন না যাতে এটি সরাসরি navigate()-কে কল করতে পারে। ইউনিডিরেকশনাল ডেটা ফ্লো (UDF) নীতি অনুযায়ী, কম্পোজেবলকে পরিবর্তে এমন একটি ইভেন্ট এক্সপোজ করতে হবে যা NavController ম্যানেজ করে।

আরও সরাসরি বলতে গেলে, আপনার কম্পোজেবলে () -> Unit ধরনের প্যারামিটার থাকতে হবে। composable() ফাংশন ব্যবহার করে আপনার NavController.navigate()-এ ডেস্টিনেশন যোগ করার সময়, আপনার কম্পোজেবলকে NavController.navigate()-এ কল পাস করুন।NavHost

এর উদাহরণ দেখতে নিম্নলিখিত উপবিভাগ দেখুন।

উদাহরণ

আগের বিভাগগুলির উদাহরণ হিসেবে, নিম্নলিখিত স্নিপেটে এইসব পয়েন্ট লক্ষ্য করুন:

  1. গ্রাফের প্রতিটি গন্তব্য একটি রুট ব্যবহার করে তৈরি করা হয়, যা একটি সিরিয়ালাইজেবল অবজেক্ট বা ক্লাস যা সেই গন্তব্যের জন্য প্রয়োজনীয় ডেটা বর্ণনা করে।
  2. MyAppNavHost কম্পোজেবল NavController ইনস্ট্যান্স হোল্ড করে।
  3. সেই অনুযায়ী, navigate()-এ কল সেখানে হওয়া উচিত এবং ProfileScreen-এর মতো লোয়ার কম্পোজেবলে নয়।
  4. ProfileScreen-এ একটি বোতাম আছে যা ক্লিক করলে ব্যবহারকারীকে FriendsList-এ নিয়ে যায়। তবে, এটি নিজে থেকে navigate()-এ কল করে না।
  5. পরিবর্তে, বোতামটি এমন একটি ফাংশন কল করে যা প্যারামিটার হিসেবে প্রকাশ করা হয় onNavigateToFriends.
  6. MyAppNavHost যখন নেভিগেশন গ্রাফে ProfileScreen যোগ করে, তখন onNavigateToFriends-এর জন্য এটি একটি ল্যাম্বডা পাস করে যা navigate(route = FriendsList) কল করে।
  7. এটি নিশ্চিত করে যে ব্যবহারকারী 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-এ নেভিগেট করতে পারবেন:

Kotlin

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);
  }
});

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

Fragment-ভিত্তিক অ্যাপে Compose থেকে নেভিগেট করা

আপনি ফ্র্যাগমেন্ট-ভিত্তিক নেভিগেশন আর্কিটেকচারের (যেমন, মিক্সড ভিউ এবং Compose অ্যাপে) মধ্যে Jetpack Compose ব্যবহার করলে, সরাসরি নেভিগেট করার জন্য টাইপ-নিরাপদ Compose রুট ব্যবহার করতে পারবেন না। পরিবর্তে, আপনার XML নেভিগেশন গ্রাফে সংজ্ঞায়িত পূর্ণসংখ্যা আইডি (অ্যাকশন) ব্যবহার করতে হবে।

Compose কোড থেকে গন্তব্য পরিবর্তন করতে, আপনার কম্পোজেবল থেকে একটি ইভেন্ট (ল্যাম্বডা) এক্সপোজ করুন:

@Composable
fun MyScreen(onNavigateToProfile: () -> Unit) {
    Button(onClick = { onNavigateToProfile() }) {
        Text("Go to Profile")
    }
}

আপনার ফ্র্যাগমেন্টে, ইভেন্ট ট্রিগার হলে ফ্র্যাগমেন্টের NavController কল করে Compose এবং ফ্র্যাগমেন্ট-ভিত্তিক নেভিগেশন কম্পোনেন্ট ব্রিজ করুন:

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    return ComposeView(requireContext()).apply {
        setContent {
            MyScreen(onNavigateToProfile = { findNavController().navigate(R.id.nav_profile) })
        }
    }
}

এই পদ্ধতি আপনার কম্পোজেবলকে পুনর্ব্যবহারযোগ্য এবং পরীক্ষাযোগ্য রাখে, কারণ সেগুলি সরাসরি ফ্র্যাগমেন্টের NavController-এর উপর নির্ভর করে না।

NavDeepLinkRequest ব্যবহার করে নেভিগেট করুন

ইমপ্লিসিট ডিপ লিংক গন্তব্যে নেভিগেট করতে, navigate(NavDeepLinkRequest) ওভারলোড ব্যবহার করুন। নিম্নলিখিত স্নিপেট এই পদ্ধতির প্রয়োগ দেখায়:

Kotlin

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 ফ্রেমওয়ার্কের সাথে ব্যবহার করতে পারেন। এই ওভারলোড সম্পর্কে আরও জানতে রেফারেন্স ডকুমেন্টেশন দেখুন।

আরও পড়ুন

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