আপনি NavEntryDecorator ক্লাস ব্যবহার করে অতিরিক্ত তথ্য প্রদান করতে পারেন অথবা গন্তব্যস্থলে একই যুক্তি প্রয়োগ করতে পারেন। এই ক্লাসটি প্রতিটি NavEntry একটি কম্পোজেবল ফাংশন সহ একটি ব্যাক স্ট্যাকে মোড়ানো হয়। অন্যভাবে বলতে গেলে, এটি এন্ট্রির বিষয়বস্তুকে সাজায় ।
একটি কাস্টম ডেকোরেটর তৈরি করুন
একটি ডেকোরেটর তৈরি করতে, NavEntryDecorator ক্লাসটি প্রসারিত করুন এবং নিম্নলিখিত পদ্ধতিগুলি ওভাররাইড করুন:
-
decorate- একটি কম্পোজেবল ল্যাম্বডা যা আপনার ব্যাক স্ট্যাকের প্রতিটিNavEntryজন্য ডাকা হয়। এটিNavEntryএকটি প্যারামিটার হিসেবে গ্রহণ করে। এটি আপনাকে এমন স্টেট অবজেক্ট তৈরি করতে দেয় যা এন্ট্রিরcontentKeyএর সাথে সংযুক্ত থাকে। আপনিCompositionLocalProviderব্যবহার করে এন্ট্রির কন্টেন্টের উপর নির্ভরতা প্রদান করতে পারেন। আপনি একটি কম্পোজেবল ফাংশন দিয়ে কন্টেন্টকে ঘিরে রাখতে পারেন, অথবা পার্শ্ব প্রতিক্রিয়া ট্রিগার করতে পারেন। এই পদ্ধতিতে আপনার সর্বদাentry.Content()কল করা উচিত। -
onPop- একটি কলব্যাক যা ব্যাক স্ট্যাক থেকে একটিNavEntryসরানো হলে এবং কম্পোজিশন ছেড়ে গেলে আহ্বান করা হয়। এটি সরানো এন্ট্রিরcontentKeyগ্রহণ করে। সেই এন্ট্রির সাথে সম্পর্কিত যেকোনো অবস্থা সনাক্ত করতে এবং পরিষ্কার করতেcontentKeyব্যবহার করুন।
নিম্নলিখিত উদাহরণটি একটি কাস্টম ডেকোরেটর তৈরি করতে NavEntryDecorator ক্লাসকে প্রসারিত করে।
// import androidx.navigation3.runtime.NavEntryDecorator class CustomNavEntryDecorator<T : Any> : NavEntryDecorator<T>( decorate = { entry -> Log.d("CustomNavEntryDecorator", "entry with ${entry.contentKey} entered composition and was decorated") entry.Content() }, onPop = { contentKey -> Log.d("CustomNavEntryDecorator", "entry with $contentKey was popped") } )
যদি আপনার ডেকোরেটরের স্টেট অ্যাক্সেসের প্রয়োজন হয়, তাহলে একটি কম্পোজেবল ফাংশন তৈরি করুন যা সেই স্টেট তৈরি করে এবং তারপর ডেকোরেটর তৈরি করতে এটি ব্যবহার করুন। একটি উদাহরণ বাস্তবায়নের জন্য, rememberSaveableStateHolderNavEntryDecorator এর সোর্স কোড দেখুন। এটি স্টেট তৈরি করে - একটি SaveableStateHolder - এবং ডেকোরেটর তৈরি করতে এটি ব্যবহার করে।
একটি ব্যাক স্ট্যাক সাজান
একবার আপনি আপনার NavEntryDecorator তৈরি করে ফেললে, আপনার ব্যাক স্ট্যাকের এন্ট্রিগুলিকে দুটি উপায়ের একটিতে সাজান:
-
rememberDecoratedNavEntriesব্যবহার করুন। এই ফাংশনটি তখন কার্যকর যখন আপনার একাধিক ব্যাক স্ট্যাক থাকে, প্রতিটির নিজস্ব ডেকোরেটরের সেট থাকে (আরও বিস্তারিত জানার জন্য এই কোড রেসিপিটি দেখুন)। ফাংশনটিNavEntryএর একটি সজ্জিত তালিকা প্রদান করে যা আপনিNavDisplayসাথে ব্যবহার করতে পারেন। -
entryDecoratorsপ্যারামিটার ব্যবহার করে আপনার ডেকোরেটর সরাসরিNavDisplayএ সরবরাহ করুন।NavDisplayহুডের নিচেrememberDecoratedNavEntriesকল করে এবং সজ্জিত এন্ট্রিগুলি প্রদর্শন করে।
ডিফল্ট ডেকোরেটর অন্তর্ভুক্ত করুন
নেভিগেশন ৩-এ SaveableStateHolderNavEntryDecorator নামে একটি ডিফল্ট ডেকোরেটর রয়েছে যা কনফিগারেশন পরিবর্তন এবং প্রক্রিয়া মৃত্যুর মাধ্যমে NavEntry এর অবস্থা ধরে রাখতে সক্ষম করে। এটি NavEntry কন্টেন্টকে SaveableStateProvider দিয়ে মোড়ানো করে, যা NavEntry কন্টেন্টের ভিতরে থাকা rememberSaveable কলগুলিকে সঠিকভাবে কাজ করতে সক্ষম করে।
যদি আপনার ডেকোরেটর SaveableStateProvider প্রদান না করে, তাহলে আপনার সরবরাহকৃত ডেকোরেটরের তালিকায় প্রথম ডেকোরেটর হিসেবে SaveableStateHolderNavEntryDecorator অন্তর্ভুক্ত করা উচিত। এটি rememberSaveableStateHolderNavEntryDecorator ব্যবহার করে তৈরি করা হয়েছে।
উদাহরণস্বরূপ:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
কখন ডেকোরেটর ব্যবহার করবেন
একটি ডেকোরেটর ব্যবহার করুন:
- ব্যাক স্ট্যাকের প্রতিটি
NavEntryএর জন্য একটি নির্ভরতা তৈরি করুন। উদাহরণস্বরূপ,ViewModelStoreNavEntryDecoratorপ্রতিটিNavEntryএর জন্য একটিViewModelStoreতৈরি করে। - একাধিক
NavEntryগুলিতে একটি বস্তুকে স্কোপ করুন। উদাহরণস্বরূপ, একাধিক এন্ট্রির মধ্যে একটিViewModelভাগ করে নেওয়া। - একাধিক
NavEntryএর জন্য একই কাজ সম্পাদন করুন। উদাহরণস্বরূপ, প্রতিটি এন্ট্রির জন্য লগিং, ডিবাগিং বা ট্রেসিং অপারেশন সম্পাদন করা। - একই কম্পোজেবল ফাংশন দিয়ে
NavEntryগুলি মোড়ানো। -
NavEntryএর সাথে সম্পর্কিত ক্লিন আপ স্টেট। উদাহরণস্বরূপ, যখন ব্যাক স্ট্যাক থেকে একটি এন্ট্রি সরানো হয় তখনViewModelStoreNavEntryDecoratorতার সাথে সম্পর্কিতViewModelStoreসাফ করে।
ডেকোরেটর ব্যবহার করবেন না:
- একটি একক
NavEntryতে নির্ভরতা স্থানান্তর করুন। - এমন নির্ভরতা প্রদান করুন যার পরিধি ব্যাক স্ট্যাকের চেয়ে বিস্তৃত।
এই উভয় ক্ষেত্রেই, NavEntry তৈরি করার সময় সরাসরি নির্ভরতা পাস করুন।
আরও কোড উদাহরণের জন্য, NavEntryDecorator দেখুন।