আপনি 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 এর অবস্থা ধরে রাখতে সক্ষম করে। এটি একটি SaveableStateProvider দিয়ে NavEntry কন্টেন্টকে র্যাপ করে, যা NavEntry কন্টেন্টের ভেতরের rememberSaveable কলগুলোকে সঠিকভাবে কাজ করতে সাহায্য করে।
যদি আপনার ডেকোরেটর কোনো SaveableStateProvider প্রদান না করে, তাহলে আপনার সরবরাহকৃত ডেকোরেটরের তালিকায় প্রথম ডেকোরেটর হিসেবে SaveableStateHolderNavEntryDecorator অন্তর্ভুক্ত করা উচিত। এটি rememberSaveableStateHolderNavEntryDecorator ব্যবহার করে তৈরি করা হয়।
উদাহরণস্বরূপ:
// import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator NavDisplay( entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), remember { CustomNavEntryDecorator() } ), // ... )
ResultEventBusNavEntryDecorator ব্যবহার করে ফলাফল প্রেরণ করুন।
Navigation 3 1.2.0 থেকে শুরু করে, আপনি LocalResultEventBus কম্পোজিশন লোকাল ব্যবহার করে প্রতিটি NavEntry তে একটি ResultEventBus সরবরাহ করতে ResultEventBusNavEntryDecorator ব্যবহার করতে পারেন।
ডিফল্টরূপে, rememberResultEventBusNavEntryDecorator অভ্যন্তরীণভাবে rememberResultEventBus ব্যবহার করে তার নিজস্ব ResultEventBus ইনস্ট্যান্স তৈরি করে এবং মনে রাখে। যদি আপনার ডেকোরেটর হায়ারার্কির বাইরে (যেমন টপ-লেভেল অ্যাপ স্ক্যাফোল্ডিং-এ) ইভেন্ট বাস অ্যাক্সেস করার প্রয়োজন হয়, তাহলে আপনি rememberResultEventBus কল করে এবং এটিকে rememberResultEventBusNavEntryDecorator(resultEventBus) এ পাস করে ResultEventBus কে হোইস্ট করতে পারেন:
val resultEventBus = rememberResultEventBus() NavDisplay( /* ... */ entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberResultEventBusNavEntryDecorator(resultEventBus = resultEventBus) ) )
ফলাফল পাঠানো ও পর্যবেক্ষণ করার বিষয়ে আরও বিস্তারিত জানতে, ‘ফলাফল ফেরত দিন’ দেখুন।
কখন ডেকোরেটর ব্যবহার করবেন
ডেকোরেটর ব্যবহার করুন:
- ব্যাক স্ট্যাকের প্রতিটি
NavEntryজন্য একটি ডিপেন্ডেন্সি তৈরি করুন। উদাহরণস্বরূপ,ViewModelStoreNavEntryDecoratorপ্রতিটিNavEntryজন্য একটিViewModelStoreতৈরি করে। - ফলাফল প্রেরণ করুন এবং গন্তব্যস্থলগুলোর মধ্যে যোগাযোগ স্থাপন করুন। উদাহরণস্বরূপ,
ResultEventBusNavEntryDecoratorব্যাক স্ট্যাকের গন্তব্যস্থলগুলোতে একটিResultEventBusসরবরাহ করে। - একটি অবজেক্টকে একাধিক
NavEntryএর আওতায় আনুন। উদাহরণস্বরূপ, একাধিক এন্ট্রির মধ্যে একটিViewModelশেয়ার করার জন্য। - একাধিক
NavEntryএর জন্য একই কাজ সম্পাদন করুন। উদাহরণস্বরূপ, প্রতিটি এন্ট্রির জন্য লগিং, ডিবাগিং বা ট্রেসিং অপারেশন চালাতে। -
NavEntryগুলোকে একই কম্পোজেবল ফাংশন দিয়ে র্যাপ করুন। -
NavEntryগুলির সাথে যুক্ত স্টেট পরিষ্কার করে। উদাহরণস্বরূপ, যখন ব্যাক স্ট্যাক থেকে কোনো এন্ট্রি সরানো হয়, তখনViewModelStoreNavEntryDecoratorতার সংশ্লিষ্টViewModelStoreপরিষ্কার করে দেয়।
নিম্নলিখিত ক্ষেত্রে ডেকোরেটর ব্যবহার করবেন না:
- একটিমাত্র
NavEntryতে একটি ডিপেন্ডেন্সি পাস করুন। - এমন ডিপেন্ডেন্সি প্রদান করুন যার পরিধি ব্যাক স্ট্যাকের চেয়েও বিস্তৃত।
এই উভয় ক্ষেত্রেই, NavEntry তৈরি করার সময় সরাসরি ডিপেন্ডেন্সিটি পাস করুন।
আরও কোড উদাহরণের জন্য, NavEntryDecorator দেখুন।