تعديل المشاهد باستخدام أدوات تزيين المشاهد

تتيح لك أدوات تزيين المشهد تعديل المشهد الذي يتم احتسابه من خلال استراتيجية المشهد في تطبيقك. وبالتالي، يتم استخدامها في مرحلة ثانية من إنشاء المحتوى الذي تعرضه 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
        }
    }

}

class MyDecoratingScene<T : Any>(scene: Scene<T>) : Scene<T> {

    // ...

    override val content = @Composable {
        scene.content()
    }
}

استخدام استراتيجيات أداة تزيين المشهد

لاستخدام استراتيجيات أدوات تزيين المشهد، يجب توفيرها إلى NavDisplay باستخدام المَعلمة sceneDecoratorStrategies. عند تزيين المشاهد، تستدعي 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 الخاصة به.NavDisplay

عند إضافة أدوات تزيين المشاهد إلى تطبيقك، يمكن أن يظل نوع المشهد الذي يتم عرضه بعد تزيينه كما هو، حتى عند تغيير نوع المشهد الذي يتم عرضه أثناء احتساب المشهد. عند حدوث ذلك، وعندما تنسخ مشاهد التزيين key المشهد الذي يتم تزيينه مباشرةً، لن تحدث الصور المتحركة المضمّنة لأنّ المفتاح المشتق لا يتغيّر.

للحفاظ على إتاحة الرسوم المتحركة المضمّنة، يجب أن تستخدم المشاهد التي يتم تزيينها مفتاحًا مشتقًا من الفئة وkey للمشهد الذي تعرضه calculateScene.

class DerivedKeyScene<T : Any>(scene: Scene<T>) : Scene<T> {
    override val key = scene::class to scene.key

    // ...
}