الثبات في الإنشاء

يعتبر Compose الأنواع إما ثابتة أو غير مستقرة. ويكون النوع مستقرًا إذا كان غير قابل للتغيير، أو إذا كان بإمكان ComposeAllowed ما إذا كانت قيمته قد تغيّرت بين عمليات إعادة الإنشاء. يكون النوع غير مستقر إذا لم يتمكن Compose من معرفة ما إذا كانت قيمته قد تغيرت بين عمليات إعادة الإنشاء.

يستخدم Compose ثبات المَعلمات الخاصة بعنصر قابل للإنشاء لتحديد ما إذا كان بإمكانه تخطّي العنصر القابل للإنشاء أثناء عملية إعادة الإنشاء:

  • المعلَمات الثابتة: إذا كان العنصر القابل للإنشاء يحتوي على معلَمات ثابتة لم تتغيّر، سيتخطّاها Compose.
  • المعلَمات غير الثابتة: إذا كان العنصر القابل للإنشاء يحتوي على معلَمات غير مستقرة، يعيد Compose إنشاءها دائمًا عند إعادة إنشاء العنصر الرئيسي للمكوِّن.

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

يوضّح هذا المستند بالتفصيل كيفية زيادة ثبات تطبيقك لتحسين الأداء وتجربة المستخدم بشكل عام.

عناصر غير قابلة للتغيير

توضح المقتطفات التالية المبادئ العامة الكامنة وراء الاستقرار وإعادة الإنشاء.

الفئة Contact هي فئة بيانات غير قابلة للتغيير. وذلك لأنّ جميع معلَماتها هي قيم أولية تم تحديدها باستخدام الكلمة الرئيسية val. بعد إنشاء مثيل Contact، لا يمكنك تغيير قيمة خصائص الكائن. إذا حاولت إجراء ذلك، عليك إنشاء كائن جديد.

data class Contact(val name: String, val number: String)

تحتوي السمة ContactRow القابلة للإنشاء على معلَمة من النوع Contact.

@Composable
fun ContactRow(contact: Contact, modifier: Modifier = Modifier) {
   var selected by remember { mutableStateOf(false) }

   Row(modifier) {
      ContactDetails(contact)
      ToggleButton(selected, onToggled = { selected = !selected })
   }
}

يجب التفكير في ما يحدث عندما ينقر المستخدم على زرّ الإيقاف/التفعيل وتتغيّر حالة selected:

  1. يقيّم Compose ما إذا كان يجب إعادة إنشاء الرمز داخل ContactRow.
  2. يتضح لي أنّ الوسيطة الوحيدة لـ ContactDetails هي من النوع Contact.
  3. نظرًا لأن Contact هي فئة بيانات غير قابلة للتغيير، فإن Compose على التأكد من عدم تغيير أي من وسيطات ContactDetails.
  4. وبناءً على ذلك، يتخطّى ComposeAllowed ContactDetails ولا يُعيد إنشائه.
  5. من ناحية أخرى، تم تغيير وسيطات ToggleButton، وأعاد Compose إنشاء هذا المكون.

عناصر قابلة للتغيير

بينما يستخدم المثال السابق كائنًا غير قابل للتغيير، من الممكن إنشاء كائن قابل للتغيير. ضع في الاعتبار المقتطف التالي:

data class Contact(var name: String, var number: String)

بما أنّ كل مَعلمة Contact أصبحت الآن var، لم تعُد الفئة غير قابلة للتغيير. وإذا تم تغيير خصائصه، لن يتم اكتشاف ذلك Compose. ويرجع ذلك إلى أنّ ميزة ComposeAllowed فقط في التغييرات التي تُجريها على عناصر حالة الإنشاء.

يعتبر Compose هذه الفئة غير مستقرة. الكتابة لا تتخطى إعادة تشكيل الفئات غير المستقرة. على هذا النحو، إذا تم تحديد Contact بهذه الطريقة، ستتم إعادة إنشاء السمة ContactRow في المثال السابق في أي وقت يتم فيه تغيير selected.

التنفيذ في Compose

قد يكون من المفيد، على الرغم من أنه ليس بالغ الأهمية، التفكير في كيفية تحديد Compose بدقة للدوال التي يجب تخطيها أثناء إعادة الإنشاء.

عندما يتم تشغيل برنامج التجميع Compose على التعليمات البرمجية الخاصة بك، فإنه يضع علامة على كل دالة ونوع بعلامة من بين العديد من العلامات. تعكس هذه العلامات كيفية تعامل Compose مع الدالة أو الكتابة أثناء إعادة الإنشاء.

الدوال

يمكن لميزة "إنشاء" وضع علامة على الدوال باعتبارها skippable أو restartable. لاحظ أنه قد يضع علامة على دالة كواحد أو كليهما أو لا ينطبق عليها أي مما يلي:

  • قابلة للتخطي: إذا كانت أداة التحويل البرمجي تضع علامة على عنصر قابل للإنشاء كقابلة للتخطي، يمكن لـ Compose تخطيها أثناء إعادة الإنشاء إذا كانت جميع وسيطاتها مساوية لقيمها السابقة.
  • قابلة لإعادة التشغيل: عنصر قابل للإنشاء وقابل لإعادة التشغيل يعمل "كنطاق" يمكن أن تبدأ فيه عملية إعادة الإنشاء. بمعنى آخر، يمكن أن تكون الدالة نقطة دخول حيث يمكن أن يبدأ Compose في إعادة تنفيذ التعليمات البرمجية لإعادة الإنشاء بعد تغييرات الحالة.

الأنواع

تضع علامة Compose علامة على الأنواع إمّا غير قابل للتغيير أو مستقرة. كل نوع هو نوع أو آخر:

  • غير قابل للتغيير: يضع Compose علامة على النوع باعتباره غير قابل للتغيير إذا كان لا يمكن أبدًا تغيير قيمة خصائصه وكانت جميع الطرق ذات شفافية مرجعية.
    • لاحظ أن جميع الأنواع الأساسية تحمل علامة غير قابلة للتغيير. ويشمل ذلك String وInt وFloat.
  • ثابت: يشير إلى نوع يمكن أن تتغير خصائصه بعد الإنشاء. في حالة تغير هذه الخصائص أثناء وقت التشغيل، يصبح Compose على دراية بهذه التغييرات.

ثبات تصحيح الأخطاء

إذا كان تطبيقك يعيد إنشاء عنصر قابل للإنشاء لم تتغيّر معلَماته، عليك التحقّق أولاً من تعريفه للمعلَمات القابلة للتغيير بشكل واضح. تعيد Compose دائمًا إنشاء مكوِّن في حال تمرير نوع باستخدام خصائص var، أو خاصية val تستخدم نوعًا معروفًا غير ثابت.

للحصول على معلومات تفصيلية حول كيفية تشخيص المشاكل المعقدة المتعلقة بالثبات في Compose، يُرجى الاطّلاع على دليل تصحيح الأخطاء.

حلّ المشاكل المتعلّقة بالثبات

للحصول على معلومات عن كيفية تحقيق الثبات في تنفيذ ComposeAllowed، يُرجى الاطّلاع على دليل إصلاح مشاكل الثبات.

ملخّص

وبشكلٍ عام، يجب مراعاة النقاط التالية:

  • المعلمات: يحدد Compose ثبات كل مَعلمة من العناصر القابلة للإنشاء لتحديد العناصر القابلة للإنشاء التي يجب تخطيها أثناء إعادة الإنشاء.
  • إصلاحات فورية: إذا لاحظت أنّه لا يتم تخطّي عنصرك القابل للإنشاء وأنّه يتسبب في مشكلة في الأداء، عليك أولاً التحقّق من الأسباب الواضحة لعدم الثبات، مثل معلَمات var.
  • تقارير برامج التحويل البرمجي: يمكنك استخدام تقارير برامج تجميع المحتوى لتحديد الثبات الذي يتم استنتاجه بشأن صفوفك.
  • المجموعات: يعتبر Compose دائمًا فئات المجموعات غير مستقرة، مثل List, Set وMap. هذا لأنه لا يمكن ضمان أنها غير قابلة للتغيير. ويمكنك استخدام مجموعات Kotlinx غير القابلة للتغيير بدلاً من ذلك أو إضافة تعليقات توضيحية إلى الصفوف باستخدام @Immutable أو @Stable.
  • الوحدات الأخرى: تعتبر ميزة "الكتابة" دائمًا غير ثابتة في الوحدات التي لا يتم فيها تشغيل برنامج التجميع البرمجي Compose. لف الفئات في فصول نموذج واجهة المستخدم إذا لزم الأمر.

محتوى إضافي للقراءة