Kotlin DSL এবং নেভিগেশন রচনায় টাইপ নিরাপত্তা

আপনার নেভিগেশন গ্রাফের জন্য কম্পাইল-টাইম টাইপ সেফটি প্রদান করতে আপনি বিল্ট-ইন টাইপ সেফ এপিআই ব্যবহার করতে পারেন। আপনার অ্যাপ যখন নেভিগেশন কম্পোজ বা নেভিগেশন কোটলিন ডিএসএল ব্যবহার করে, তখন এই এপিআইগুলো উপলব্ধ হয়। এগুলো Navigation 2.8.0 সংস্করণ থেকে পাওয়া যাচ্ছে।

এই এপিআইগুলো এক্সএমএল ব্যবহার করে নির্মিত নেভিগেশন গ্রাফে সেফ আর্গস যা প্রদান করে, তার সমতুল্য।

পথ নির্ধারণ করুন

Compose-এ টাইপ-সেফ রাউট ব্যবহার করতে হলে, আপনাকে প্রথমে সিরিয়ালাইজেবল ক্লাস বা অবজেক্ট সংজ্ঞায়িত করতে হবে যা আপনার রাউটগুলোকে উপস্থাপন করে।

সিরিয়ালাইজেবল অবজেক্ট সংজ্ঞায়িত করতে কোটলিন সিরিয়ালাইজেশন প্লাগইন দ্বারা প্রদত্ত @Serializable অ্যানোটেশনটি ব্যবহার করুন। এই ডিপেন্ডেন্সিগুলো যোগ করার মাধ্যমে প্লাগইনটি আপনার প্রজেক্টে যুক্ত করা যেতে পারে।

আপনার রুটের জন্য কোন ধরনের রুট ব্যবহার করবেন তা নির্ধারণ করতে নিম্নলিখিত নিয়মগুলি ব্যবহার করুন:

  • অবজেক্ট : আর্গুমেন্টবিহীন রাউটগুলোর জন্য একটি অবজেক্ট ব্যবহার করুন।
  • ক্লাস : আর্গুমেন্টসহ রাউটগুলোর জন্য ক্লাস বা ডেটা ক্লাস ব্যবহার করুন।
  • KClass<T> : যদি আর্গুমেন্ট পাস করার প্রয়োজন না হয়, যেমন প্যারামিটারবিহীন কোনো ক্লাস, অথবা এমন কোনো ক্লাস যেখানে সমস্ত প্যারামিটারের ডিফল্ট মান রয়েছে, সেক্ষেত্রে এটি ব্যবহার করুন।
    1. উদাহরণস্বরূপ: Profile::class

সকল ক্ষেত্রে অবজেক্ট বা ক্লাসটিকে অবশ্যই সিরিয়ালাইজেবল হতে হবে।

উদাহরণস্বরূপ:

// Define a home route that doesn't take any arguments
@Serializable
object Home

// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)

আপনার গ্রাফ তৈরি করুন

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

NavHost(navController, startDestination = Home) {
     composable<Home> {
         HomeScreen(onNavigateToProfile = { id ->
             navController.navigate(Profile(id))
         })
     }
     composable<Profile> { backStackEntry ->
         val profile: Profile = backStackEntry.toRoute()
         ProfileScreen(profile.id)
     }
}

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

  • composable() একটি টাইপ প্যারামিটার গ্রহণ করে। অর্থাৎ, composable<Profile>
  • composable("profile") এর মতো একটি route স্ট্রিং পাস করার চেয়ে গন্তব্যের ধরণ নির্ধারণ করা একটি আরও নির্ভরযোগ্য পদ্ধতি।
  • রাউট ক্লাস প্রতিটি ন্যাভিগেশন আর্গুমেন্টের টাইপ নির্ধারণ করে দেয়, যেমন val id: String , তাই NavArgument ব্যবহার করার কোনো প্রয়োজন নেই।
  • প্রোফাইল রাউটের ক্ষেত্রে, toRoute() এক্সটেনশন মেথডটি NavBackStackEntry এবং এর আর্গুমেন্টগুলো থেকে Profile অবজেক্টটি পুনরায় তৈরি করে।

সাধারণভাবে আপনার গ্রাফ কীভাবে ডিজাইন করবেন সে সম্পর্কে আরও তথ্যের জন্য, "আপনার নেভিগেশন গ্রাফ ডিজাইন করুন" পৃষ্ঠাটি দেখুন।

ViewModel-এ আর্গুমেন্ট অ্যাক্সেস করুন

ViewModel এর কোনো টাইপ-সেফ রাউট থেকে আর্গুমেন্ট অ্যাক্সেস করতে, আপনি SavedStateHandle SavedStateHandle.toRoute<T>() কল করে রাউটটি পেতে পারেন, যেখানে T হলো আপনার রাউট ক্লাস:

class ProfileViewModel(
    savedStateHandle: SavedStateHandle
) : ViewModel() {
    private val profile = savedStateHandle.toRoute<Profile>()
    private val userInfo: Flow<UserInfo> = userInfoRepository.getUserInfo(profile.id)
}

অবশেষে, আপনি route-এর ইনস্ট্যান্সটি পাস করে navigate() ফাংশন ব্যবহার করে আপনার কম্পোজেবল-এ নেভিগেট করতে পারেন:

navController.navigate(Profile(id = 123))

এটি ব্যবহারকারীকে নেভিগেশন গ্রাফে থাকা composable<Profile> গন্তব্যে নিয়ে যায়। id এর মতো যেকোনো নেভিগেশন আর্গুমেন্ট, NavBackStackEntry.toRoute ব্যবহার করে Profile পুনর্গঠন করে এবং এর প্রোপার্টিগুলো পড়ে পাওয়া যেতে পারে।

অতিরিক্ত সম্পদ