تتيح لك أدوات تزيين المشهد تعديل المشهد الذي يتم احتسابه بواسطة استراتيجية
المشهد في تطبيقك. وبالتالي، يتم استخدامها في مرحلة ثانية من إنشاء المحتوى الذي تعرضه NavDisplay.
يتيح لك هذا الأسلوب تضمين وظائف محدّدة، مثل عرض مكوّنات شائعة في واجهة المستخدم، في أدوات تزيين المشاهد الفردية.
على سبيل المثال، لنفترض أنّ هناك تطبيقًا إنتاجيًا يتضمّن ثلاثة مسارات على أعلى مستوى: بريد وارد للرسائل الإلكترونية وبريد وارد للرسائل المباشرة وعرض التقويم. يمكن أن يستخدم هذا التطبيق أداتَي تزيين للمشهد، إحداهما لإضافة شريط تطبيق علوي يعرض المعلومات وعناصر التحكّم في المسار الحالي ذي المستوى الأعلى، والأخرى لإضافة شريط تنقّل أو شريط جانبي ثابت للتنقّل بين المسارات.
إنشاء استراتيجية لتزيين المشهد
تتّبع أدوات تزيين المشاهد نمطًا مشابهًا لاستراتيجيات المشاهد. لتحديد أداة تزيين مشهد، عليك تنفيذ واجهة SceneDecoratorStrategy. تحتوي هذه الواجهة على طريقة decorateScene، وهي مشابهة لطريقة calculateScene في الواجهة SceneStrategy.
تحدِّد 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 } } } data class MyDecoratingScene<T : Any>( val scene: Scene<T> ) : Scene<T> { // ... override val content = @Composable { scene.content() } }
استخدام استراتيجيات أدوات تزيين المشاهد
لاستخدام استراتيجيات أدوات تزيين المشهد، يجب توفيرها إلى NavDisplay باستخدام المَعلمة sceneDecoratorStrategies. عند تزيين المشاهد، تستدعي NavDisplay الطريقة decorateScene لكل استراتيجية على التوالي، وتمرّر ناتج كل استدعاء كمدخل للاستدعاء التالي.
NavDisplay( // ... sceneDecoratorStrategies = listOf(firstSceneDecoratorStrategy, secondSceneDecoratorStrategy) )
الأنماط الشائعة لعناصر تزيين المشاهد
عند تنفيذ أدوات تزيين المشاهد، إليك بعض الأنماط الشائعة التي يجب الانتباه إليها:
نسخ الخصائص
في كثير من الحالات، يجب أن يحتوي المشهد الذي يتم عرضه من خلال تزيين مشهد آخر على الإدخالات نفسها وأن يتضمّن الإدخالات السابقة نفسها التي يتضمّنها المشهد الذي يتم تزيينه. بالإضافة إلى ذلك، من المفترض أن يرث (أو يعدّل) البيانات الوصفية للمشهد الذي يزيّنه، بدلاً من استخدام السلوك التلقائي. يوضّح الرمز التالي مثالاً على كيفية إجراء ذلك:
data class CopyingScene<T : Any>( val scene: Scene<T> ) : Scene<T> { override val entries = scene.entries override val previousEntries = scene.previousEntries override val metadata = scene.metadata // ... }
الحفاظ على الصور المتحركة
كما هو موضّح في التحريك بين وجهات، يتم تلقائيًا تحريك NavDisplay للانتقالات بين المشاهد عند تغيير مفتاح مشتق من فئة المشهد الحالي وسمة key الخاصة به.
عند إضافة أدوات تزيين المشاهد إلى تطبيقك، يمكن أن يظل نوع المشهد الذي يتم عرضه بعد تزيينه كما هو، حتى عند تغيير نوع المشهد الذي يتم عرضه أثناء احتساب المشهد. عند حدوث ذلك، وعندما تنسخ المشاهد الزخرفية key المشهد الذي تزخرفه مباشرةً، لن تحدث الصور المتحركة المضمّنة لأنّ المفتاح المشتق لا يتغيّر.
للحفاظ على إمكانية استخدام الرسوم المتحركة المضمّنة، يجب أن تستخدم المشاهد التي يتم تزيينها مفتاحًا مشتقًا من الفئة وkey للمشهد الذي تعرضه calculateScene.
data class DerivedKeyScene<T : Any>( val scene: Scene<T> ) : Scene<T> { override val key = scene::class to scene.key // ... }