সিন ডেকোরেটর আপনাকে আপনার অ্যাপের সিন স্ট্র্যাটেজি দ্বারা নির্ধারিত সিন পরিবর্তন করার সুযোগ দেয়। মূলত, এগুলো NavDisplay দ্বারা প্রদর্শিত কন্টেন্ট তৈরির দ্বিতীয় পর্যায়ে ব্যবহৃত হয়।
এই পদ্ধতিটি আপনাকে নির্দিষ্ট কার্যকারিতা, যেমন সাধারণ UI উপাদান প্রদর্শন করা, স্বতন্ত্র সিন ডেকোরেটরের মধ্যে আবদ্ধ করতে দেয়।
উদাহরণস্বরূপ, এমন একটি প্রোডাক্টিভিটি অ্যাপের কথা ভাবুন যেখানে তিনটি টপ-লেভেল রুট আছে: একটি ইমেল ইনবক্স, একটি ডাইরেক্ট মেসেজ ইনবক্স এবং একটি ক্যালেন্ডার ভিউ। এই ধরনের একটি অ্যাপে দুটি সিন ডেকোরেটর ব্যবহার করা যেতে পারে—একটি বর্তমান টপ-লেভেল রুটের তথ্য ও কন্ট্রোলগুলো প্রদর্শন করার জন্য একটি টপ অ্যাপ বার যোগ করতে এবং অন্যটি রুটগুলোর মধ্যে নেভিগেট করার জন্য একটি পারসিস্টেন্ট নেভিগেশন বার বা রেইল যোগ করতে।
একটি দৃশ্য সজ্জাকার কৌশল তৈরি করুন
সিন ডেকোরেটরগুলো সিন স্ট্র্যাটেজির মতোই একই প্যাটার্ন অনুসরণ করে। একটি সিন ডেকোরেটর সংজ্ঞায়িত করতে, SceneDecoratorStrategy ইন্টারফেসটি ইমপ্লিমেন্ট করুন। এই ইন্টারফেসে decorateScene নামে একটি মেথড আছে, যা SceneStrategy ইন্টারফেসের calculateScene মেথডের অনুরূপ। decorateScene নির্ধারণ করে যে এটি সিনটিকে ডেকোরেট করতে পারবে কি না:
- যদি আপনার সিন ডেকোরেটর স্ট্র্যাটেজি ইনপুট সিনকে ডেকোরেট করার প্রয়োজন না হয় , তবে এটি ইনপুট সিনটিকে হুবহু ফেরত দেয়।
- যদি এটি ইনপুট সিনকে সজ্জিত করতে চায় , তবে এটি একটি নতুন
Sceneরিটার্ন করে। সাধারণত, রিটার্ন করা সিনটি ইনপুট সিনকে একটি প্যারামিটার হিসেবে গ্রহণ করে এবং তার নিজেরcontentমেথডের মধ্যে ইনপুট সিনেরcontentমেথডকে কল করে।
ইনপুট সিনটি ডেকোরেট করা হবে কি না এবং কীভাবে করা হবে, তা নির্ধারণ করতে আপনার সিন ডেকোরেটর স্ট্র্যাটেজিটি ইনপুট Scene এবং সেই সিনের অন্তর্ভুক্ত এন্ট্রিগুলোর মেটাডেটা বিবেচনা করতে পারে।
class MySceneDecoratorStrategy<T : Any> : SceneDecoratorStrategy<T> { override fun SceneDecoratorStrategyScope<T>.decorateScene(scene: Scene<T>): Scene<T> { // `shouldDecorate` determines if the scene should be decorated based on scene.metadata, // scene.entries.metadata, or any other relevant state. return if (shouldDecorate(scene)) { MyDecoratingScene(scene) } else { scene } } } class MyDecoratingScene<T : Any>(scene: Scene<T>) : Scene<T> { // ... override val content = @Composable { scene.content() } }
দৃশ্য সজ্জা কৌশল ব্যবহার করুন
সিন ডেকোরেটর স্ট্র্যাটেজি ব্যবহার করতে, sceneDecoratorStrategies প্যারামিটার ব্যবহার করে সেগুলোকে আপনার NavDisplay তে সরবরাহ করুন। সিন ডেকোরেট করার সময়, NavDisplay ক্রমান্বয়ে প্রতিটি স্ট্র্যাটেজির decorateScene মেথডকে কল করে এবং প্রতিটি কলের আউটপুটকে পরবর্তী কলের ইনপুট হিসেবে পাস করে।
NavDisplay( // ... sceneDecoratorStrategies = listOf(firstSceneDecoratorStrategy, secondSceneDecoratorStrategy) )
দৃশ্য সজ্জাকারীদের জন্য সাধারণ নকশা
সিন ডেকোরেটর প্রয়োগ করার সময়, নিম্নলিখিত কিছু সাধারণ প্যাটার্ন সম্পর্কে সচেতন থাকা প্রয়োজন:
বৈশিষ্ট্যগুলি অনুলিপি করুন
অনেক ক্ষেত্রে, একটি সিনকে ডেকোরেট করার মাধ্যমে প্রাপ্ত সিনটিতে, যে সিনটিকে ডেকোরেট করা হচ্ছে তার মতোই একই এন্ট্রি এবং পূর্ববর্তী এন্ট্রি থাকা উচিত। এছাড়াও, ডিফল্ট আচরণ ব্যবহার না করে, এটির সম্ভবত যে সিনটিকে ডেকোরেট করা হচ্ছে তার মেটাডেটা ইনহেরিট (বা মডিফাই) করা উচিত। নিচের কোডটি এটি কীভাবে করতে হয় তার একটি উদাহরণ প্রদর্শন করে:
class CopyingScene<T : Any>(scene: Scene<T>) : Scene<T> { override val entries = scene.entries override val previousEntries = scene.previousEntries override val metadata = scene.metadata // ... }
অ্যানিমেশন বজায় রাখুন
"গন্তব্যগুলির মধ্যে অ্যানিমেট করুন" অংশে যেমন বিস্তারিতভাবে বলা হয়েছে, যখন বর্তমান দৃশ্যের ক্লাস এবং এর key প্রপার্টি থেকে প্রাপ্ত কোনো 'key' পরিবর্তিত হয়, তখন NavDisplay স্বয়ংক্রিয়ভাবে দৃশ্যগুলির মধ্যে রূপান্তর অ্যানিমেট করে।
আপনার অ্যাপে সিন ডেকোরেটর ব্যবহার করার সময়, সিন ক্যালকুলেশনের সময় প্রাপ্ত সিনের ক্লাস পরিবর্তিত হলেও, সিন ডেকোরেশনের পরে প্রাপ্ত সিনের ক্লাস একই থাকতে পারে। যখন এমনটা ঘটে এবং ডেকোরেটিং সিনগুলো সরাসরি যে সিনকে ডেকোরেট করছে তার key কপি করে, তখন বিল্ট-ইন অ্যানিমেশনগুলো আর চলে না, কারণ ডিরাইভড কী (derived key) পরিবর্তিত হয় না।
অন্তর্নির্মিত অ্যানিমেশন সমর্থন বজায় রাখতে, দৃশ্য সাজানোর জন্য calculateScene দ্বারা ফেরত আসা দৃশ্যের ক্লাস এবং key থেকে উদ্ভূত একটি কী ব্যবহার করা উচিত।
class DerivedKeyScene<T : Any>(scene: Scene<T>) : Scene<T> { override val key = scene::class to scene.key // ... }