জেটপ্যাক নেভিগেশনকে নেভিগেশন কম্পোজে স্থানান্তর করুন

জেটপ্যাক নেভিগেশনের উপাদান, পরিকাঠামো এবং বৈশিষ্ট্যগুলির সুবিধা নেওয়ার সময় নেভিগেশন কম্পোজ API আপনাকে একটি রচনা অ্যাপে কম্পোজেবলগুলির মধ্যে নেভিগেট করতে দেয়।

এই পৃষ্ঠাটি বর্ণনা করে কিভাবে একটি ফ্র্যাগমেন্ট-ভিত্তিক জেটপ্যাক নেভিগেশন থেকে নেভিগেশন কম্পোজে স্থানান্তর করা যায়, জেটপ্যাক রচনায় বৃহত্তর, ভিউ-ভিত্তিক UI মাইগ্রেশনের অংশ হিসাবে।

মাইগ্রেশন পূর্বশর্ত

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

শুধুমাত্র-কম্পোজ অ্যাপে নেভিগেশন কম্পোজ ব্যবহার করা একটি পূর্বশর্ত নয়। আপনি ফ্র্যাগমেন্ট-ভিত্তিক ন্যাভিগেশন উপাদান ব্যবহার চালিয়ে যেতে পারেন, যতক্ষণ না আপনি আপনার রচনাযোগ্য সামগ্রী হোস্ট করার জন্য ফ্র্যাগমেন্টগুলি রাখেন৷

মাইগ্রেশন পদক্ষেপ

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

যদি আপনার অ্যাপটি ইতিমধ্যেই একটি UDF ডিজাইন প্যাটার্ন এবং আর্কিটেকচারের জন্য আমাদের নির্দেশিকা অনুসরণ করে থাকে, তাহলে Jetpack Compose এবং Navigation Compose-এ স্থানান্তরিত করার জন্য UI স্তর ছাড়াও আপনার অ্যাপের অন্যান্য স্তরগুলির প্রধান রিফ্যাক্টরের প্রয়োজন হবে না৷

নেভিগেশন রচনায় স্থানান্তর করতে, এই পদক্ষেপগুলি অনুসরণ করুন:

  1. আপনার অ্যাপে নেভিগেশন কম্পোজ নির্ভরতা যোগ করুন।
  2. একটি App-level কম্পোজেবল তৈরি করুন এবং এটিকে আপনার কম্পোজ এন্ট্রি পয়েন্ট হিসাবে আপনার Activity যোগ করুন, ভিউ লেআউটের সেটআপটি প্রতিস্থাপন করুন:

    class SampleActivity : ComponentActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            // setContentView<ActivitySampleBinding>(this, R.layout.activity_sample)
            setContent {
                SampleApp(/* ... */)
            }
        }
    }

  3. প্রতিটি নেভিগেশন গন্তব্যের জন্য প্রকার তৈরি করুন। গন্তব্যগুলির জন্য একটি data object ব্যবহার করুন যেগুলির জন্য কোনও ডেটা এবং data class বা class প্রয়োজন হয় না যার জন্য ডেটা প্রয়োজন৷

    @Serializable data object First
    @Serializable data class Second(val id: String)
    @Serializable data object Third
    

  4. এমন জায়গায় NavController সেট আপ করুন যেখানে এটির রেফারেন্স করার জন্য প্রয়োজনীয় সমস্ত কম্পোজেবলের এটিতে অ্যাক্সেস রয়েছে (এটি সাধারণত আপনার App কম্পোজেবলের ভিতরে থাকে)। এই পদ্ধতিটি রাষ্ট্র উত্তোলনের নীতিগুলি অনুসরণ করে এবং আপনাকে কম্পোজেবল স্ক্রিনের মধ্যে নেভিগেট করার জন্য এবং ব্যাক স্ট্যাক বজায় রাখার জন্য সত্যের উত্স হিসাবে NavController ব্যবহার করতে দেয়:

    @Composable
    fun SampleApp() {
        val navController = rememberNavController()
        // ...
    }

  5. App কম্পোজেবলের ভিতরে আপনার অ্যাপের NavHost তৈরি করুন এবং navController পাস করুন:

    @Composable
    fun SampleApp() {
        val navController = rememberNavController()
    
        SampleNavHost(navController = navController)
    }
    
    @Composable
    fun SampleNavHost(
        navController: NavHostController
    ) {
        NavHost(navController = navController, startDestination = First) {
            // ...
        }
    }

  6. আপনার নেভিগেশন গ্রাফ তৈরি করতে composable গন্তব্য যোগ করুন। যদি প্রতিটি স্ক্রীন পূর্বে কম্পোজে স্থানান্তরিত হয়ে থাকে, তবে এই ধাপে শুধুমাত্র এই স্ক্রীন কম্পোজেবলগুলিকে আপনার টুকরোগুলি থেকে composable গন্তব্যগুলিতে বের করে নেওয়া হয়:

    class FirstFragment : Fragment() {
    
        override fun onCreateView(
            inflater: LayoutInflater,
            container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View {
            return ComposeView(requireContext()).apply {
                setContent {
                    // FirstScreen(...) EXTRACT FROM HERE
                }
            }
        }
    }
    
    @Composable
    fun SampleNavHost(
        navController: NavHostController
    ) {
        NavHost(navController = navController, startDestination = First) {
            composable<First> {
                FirstScreen(/* ... */) // EXTRACT TO HERE
            }
            composable<Second> {
                SecondScreen(/* ... */)
            }
            // ...
        }
    }

  7. আপনি যদি আপনার কম্পোজ UI আর্কিটেক্ট করার নির্দেশিকা অনুসরণ করেন, বিশেষত কীভাবে ViewModel s এবং নেভিগেশন ইভেন্টগুলি কম্পোজেবলগুলিতে পাস করা উচিত, পরবর্তী পদক্ষেপটি হল আপনি কীভাবে প্রতিটি স্ক্রীন কম্পোজেবলে ViewModel প্রদান করবেন তা পরিবর্তন করা। আপনি প্রায়ই হিল্ট ইনজেকশন এবং এর ইন্টিগ্রেশন পয়েন্ট ব্যবহার করতে পারেন hiltViewModel মাধ্যমে কম্পোজ এবং নেভিগেশনের সাথে:

    @Composable
    fun FirstScreen(
        // viewModel: FirstViewModel = viewModel(),
        viewModel: FirstViewModel = hiltViewModel(),
        onButtonClick: () -> Unit = {},
    ) {
        // ...
    }

  8. সমস্ত findNavController() নেভিগেশন কলগুলিকে navController দিয়ে প্রতিস্থাপন করুন এবং সমগ্র navController পাস করার পরিবর্তে প্রতিটি সংমিশ্রণযোগ্য স্ক্রিনে নেভিগেশন ইভেন্ট হিসাবে এগুলি প্রেরণ করুন। এই পদ্ধতিটি কম্পোজযোগ্য ফাংশন থেকে ইভেন্টগুলিকে কলকারীদের কাছে প্রকাশ করার সর্বোত্তম অনুশীলনগুলি অনুসরণ করে এবং navController সত্যের একক উত্স হিসাবে রাখে।

    সেই গন্তব্যের জন্য সংজ্ঞায়িত রুট ক্লাসের একটি উদাহরণ তৈরি করে একটি গন্তব্যে ডেটা প্রেরণ করা যেতে পারে। তারপরে এটি সরাসরি গন্তব্যের পিছনের স্ট্যাক এন্ট্রি থেকে বা SavedStateHandle.toRoute() ব্যবহার করে একটি ViewModel থেকে প্রাপ্ত করা যেতে পারে।

    @Composable
    fun SampleNavHost(
        navController: NavHostController
    ) {
        NavHost(navController = navController, startDestination = First) {
            composable<First> {
                FirstScreen(
                    onButtonClick = {
                        // findNavController().navigate(firstScreenToSecondScreenAction)
                        navController.navigate(Second(id = "ABC"))
                    }
                )
            }
            composable<Second> { backStackEntry ->
                val secondRoute = backStackEntry.toRoute<Second>()
                SecondScreen(
                    id = secondRoute.id,
                    onIconClick = {
                        // findNavController().navigate(secondScreenToThirdScreenAction)
                        navController.navigate(Third)
                    }
                )
            }
            // ...
        }
    }

  9. সমস্ত টুকরো, প্রাসঙ্গিক XML লেআউট, অপ্রয়োজনীয় নেভিগেশন এবং অন্যান্য সংস্থানগুলি এবং বাসি ফ্র্যাগমেন্ট এবং জেটপ্যাক নেভিগেশন নির্ভরতাগুলি সরান৷

আপনি সেটআপ ডকুমেন্টেশনে আরও নেভিগেশন রচনা-সম্পর্কিত বিবরণ সহ একই পদক্ষেপগুলি খুঁজে পেতে পারেন।

সাধারণ ব্যবহারের ক্ষেত্রে

আপনি কোন ন্যাভিগেশন উপাদান ব্যবহার করছেন না কেন, নেভিগেশনের একই নীতিগুলি প্রযোজ্য

মাইগ্রেট করার সময় সাধারণ ব্যবহারের ক্ষেত্রে নিম্নলিখিতগুলি অন্তর্ভুক্ত থাকে:

এই ব্যবহারের ক্ষেত্রে আরও বিস্তারিত তথ্যের জন্য, রচনার সাথে নেভিগেটিং দেখুন।

নেভিগেট করার সময় জটিল ডেটা পুনরুদ্ধার করুন

আমরা দৃঢ়ভাবে নেভিগেট করার সময় জটিল ডেটা অবজেক্টের কাছাকাছি না যাওয়ার পরামর্শ দিই। পরিবর্তে, ন্যাভিগেশন অ্যাকশনগুলি সম্পাদন করার সময় আর্গুমেন্ট হিসাবে ন্যূনতম প্রয়োজনীয় তথ্য, যেমন একটি অনন্য শনাক্তকারী বা অন্য ধরনের আইডি পাস করুন। আপনার জটিল বস্তুগুলিকে ডেটা হিসাবে সঞ্চয় করা উচিত সত্যের একক উৎসে, যেমন ডেটা স্তর । আরও তথ্যের জন্য, নেভিগেট করার সময় জটিল ডেটা পুনরুদ্ধার করা দেখুন।

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

সীমাবদ্ধতা

এই বিভাগে নেভিগেশন রচনার জন্য বর্তমান সীমাবদ্ধতা বর্ণনা করে।

নেভিগেশন রচনায় ক্রমবর্ধমান স্থানান্তর

বর্তমানে, আপনি আপনার কোডে গন্তব্য হিসেবে ফ্র্যাগমেন্ট ব্যবহার করার সময় নেভিগেশন কম্পোজ ব্যবহার করতে পারবেন না। নেভিগেশন কম্পোজ ব্যবহার শুরু করতে, আপনার সমস্ত গন্তব্য কম্পোজেবল হতে হবে। আপনি ইস্যু ট্র্যাকারে এই বৈশিষ্ট্যের অনুরোধটি ট্র্যাক করতে পারেন।

ট্রানজিশন অ্যানিমেশন

নেভিগেশন 2.7.0-alpha01 দিয়ে শুরু করে, কাস্টম ট্রানজিশন সেট করার জন্য সমর্থন, পূর্বে AnimatedNavHost থেকে, এখন সরাসরি NavHost এ সমর্থিত। আরো তথ্যের জন্য রিলিজ নোট মাধ্যমে পড়ুন.

আরও জানুন

নেভিগেশন রচনায় স্থানান্তরিত করার বিষয়ে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন:

  • ন্যাভিগেশন কম্পোজ কোডল্যাব : হ্যান্ডস-অন কোডল্যাব দিয়ে নেভিগেশন কম্পোজের মূল বিষয়গুলি শিখুন।
  • এখন অ্যান্ড্রয়েড রিপোজিটরিতে : কোটলিন এবং জেটপ্যাক কম্পোজের সাথে সম্পূর্ণরূপে তৈরি একটি সম্পূর্ণ কার্যকরী অ্যান্ড্রয়েড অ্যাপ, যা অ্যান্ড্রয়েড ডিজাইন এবং বিকাশের সর্বোত্তম অনুশীলন অনুসরণ করে এবং নেভিগেশন কম্পোজ অন্তর্ভুক্ত করে।
  • জেটপ্যাক কম্পোজে সূর্যমুখী স্থানান্তর : একটি ব্লগ পোস্ট যা ভিউ থেকে কম্পোজে সূর্যমুখী নমুনা অ্যাপের মাইগ্রেশন যাত্রার নথিভুক্ত করে, যার মধ্যে নেভিগেশন কম্পোজে স্থানান্তরও অন্তর্ভুক্ত।
  • প্রতিটি স্ক্রিনের জন্য জেটনিউজ : একটি ব্লগ পোস্ট যা জেটপ্যাক কম্পোজ এবং নেভিগেশন কম্পোজ সহ সমস্ত স্ক্রীনকে সমর্থন করার জন্য জেটনিউজের নমুনার রিফ্যাক্টর এবং স্থানান্তর নথিভুক্ত করে।
{% শব্দার্থে %} {% endverbatim %} {% শব্দার্থে %} {% endverbatim %}