Kotlin DSL ও Navigation Compose-এ টাইপ সেফটি

আপনার নেভিগেশন গ্রাফের জন্য কম্পাইল-টাইম টাইপ সেফটি প্রদান করতে, আপনি বিল্ট-ইন টাইপ সেফ API ব্যবহার করতে পারেন। আপনার অ্যাপ Navigation Compose বা Navigation Kotlin DSL ব্যবহার করলে, এইসব API উপলভ্য হয়। Navigation 2.8.0 পর্যন্ত সেগুলি উপলভ্য।

এইসব API, XML ব্যবহার করে তৈরি করা নেভিগেশন গ্রাফের জন্য Safe Args-এর দেওয়া ফিচারের সমতুল্য।

রুট নির্ধারণ করা

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

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

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

  • অবজেক্ট: আর্গুমেন্ট ছাড়া রুটের জন্য অবজেক্ট ব্যবহার করুন।
  • ক্লাস: আর্গুমেন্ট সহ রুটের জন্য ক্লাস বা ডেটা ক্লাস ব্যবহার করুন।
  • 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.toRoute<T>() কল করে SavedStateHandle থেকে রুট রিট্রিভ করতে পারেন, যেখানে T হল আপনার রুট ক্লাস:

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

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

navController.navigate(Profile(id = 123))

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

অতিরিক্ত রিসোর্স