الإجابة المختصرة
يصنف المترجم الأنواع كـ Stable أو Immutable بناءً على ثبات قيمها؛ إذا كانت كل معاملات الدالة مستقرة ولم تتغير قيمها، يتم تخطي الدالة بالكامل.
الشرح
يعتبر النوع Immutable إذا كانت كل خصائصه المعلنة val من أنواع بدائية أو أنواع غير قابلة للتغيير. أما النوع Stable فيضمن إشعار Compose عند حدوث أي تعديل (مثل MutableState). المشكلة الشائعة تحدث مع مجموعات Kotlin القياسية (مثل List<T>) التي يعتبرها مترجم Compose غير مستقرة لأنها قد تكون MutableList في الحقيقة، وقبل Strong Skipping كان ذلك يمنع skipping حتى لو لم تتغير المحتويات. منذ Kotlin 2.0.20 أصبح وضع Strong Skipping مفعّلًا افتراضيًا: الدوال ذات المعاملات غير المستقرة أصبحت قابلة للتخطي، وتُقارن تلك المعاملات بالمرجع (===) بدلًا من equals، فيظل تمرير نسخة جديدة من القائمة في كل مرة سببًا لإعادة التكوين.
مثال بالكود
// كلاس مستقر يسمح بتخطي التكوين
@Immutable
data class UserUiModel(val id: String, val name: String)
// لتفادي اعتبار List غير مستقرة، نستخدم Kotlinx Immutable Collections:
@Composable
fun UserList(users: PersistentList<UserUiModel>) {
// تتخطى دالة التكوين بنجاح إذا لم تتغير القائمة
}أخطاء شائعة
- إنشاء نسخة جديدة من List في كل recomposition (مثل items.filter{...} داخل الدالة)، فتفشل مقارنة المرجع مع Strong Skipping (أو يصبح المكون Non-skippable في المشاريع القديمة دون Strong Skipping).
- استخدام دوال لامدا تلتقط متغيرات متغيرة دون تذكرها عبر remember.