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

تعتبر عملية الإنشاء الأنواع إما مستقرة أو غير مستقرة. ويكون النوع ثابتًا إذا غير قابل للتغيير، أو إذا كان من الممكن لنظام Compose معرفة ما إذا كانت قيمته بين التركيبات. ويكون النوع غير مستقر إذا لم يتمكن عنصر 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. وبناءً على ذلك، يتخطّى عنصر Compose ContactDetails ولا يعيد إنشائه.
  5. من ناحية أخرى، تغيّرت وسيطات ToggleButton، عند استخدام الأمر Compose، تتم إعادة ابتكار هذا المكوِّن.

العناصر القابلة للتحويل

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

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

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

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

التنفيذ في Compose

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

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

الدوال

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

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

الأنواع

أنواع علامات الإنشاء هي إما غير قابلة للتغيير أو ثابتة. يُعد كل نوع نوعًا واحدًا أو غير ذلك:

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

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

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

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

إصلاح مشاكل ثبات التطبيق

للحصول على معلومات حول كيفية تحقيق الاستقرار لتنفيذ ميزة Compose، يمكنك الاطّلاع على دليل إصلاح مشاكل الثبات

ملخّص

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

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

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