مقدمة: "التوأم" في مشروعك
\n\nتخيل الموقف: أنت تكتب كودًا بلغة Kotlin لتطبيق Android، كل شيء يعمل بشكل رائع. ثم تضيف مكتبة جديدة، وتشغل عملية البناء - ويظهر Gradle خطأ أحمر: "فئة مكررة". هل هذا مألوف؟ إذا سبق لك التعامل مع تطوير Android، فمن المحتمل أنك رأيت هذه الرسالة. على Stack Overflow، حصل هذا السؤال على آلاف المشاهدات، وليس من دون سبب - فالخطأ يمكن أن يحبط حتى المطورين ذوي الخبرة.
\n\nفي هذه المقالة، سنشرح ما هي الفئة المكررة في Kotlin Android، ولماذا تحدث، والأهم من ذلك - كيفية إصلاحها نهائيًا. ستتعرف على 5 من أكثر الأسباب شيوعًا، وستحصل على حلول جاهزة وستتعلم كيفية منع تضارب التبعيات. هيا بنا!
\n\nما هي الفئة المكررة ولماذا تحدث؟
\n\nيحدث خطأ الفئة المكررة عندما يجد نظام البناء (Gradle) فئتين متطابقتين أو أكثر بنفس الاسم الكامل (FQN). في عالم Android، يعني هذا عادةً أن نفس الفئة موجودة في مكتبات أو وحدات مختلفة من مشروعك.
تخيل أنك طلبت كتابين متطابقين، ولكن من ناشرين مختلفين. إنهما على نفس الرف - وأمين المكتبة لا يعرف أيهما يأخذ. هكذا هو Gradle: لا يمكنه تحديد أي من الفئات المكررة يجب استخدامها.
\n\nلماذا هذا مهم بشكل خاص لـ Kotlin؟ يستخدم Kotlin بشكل نشط مكتبته القياسية (kotlin-stdlib)، والتي قد تتعارض مع إصداراتها من مصادر أخرى. أضف إلى ذلك AndroidX ومكتبات Google وFirebase - وستحصل على مزيج متفجر.
أهم 5 أسباب لخطأ الفئة المكررة في Kotlin Android
\n\nلقد جمعنا السيناريوهات الأكثر شيوعًا التي قد تواجهها في التطوير الفعلي. كل نقطة مصحوبة بمثال كود وحل.
\n\n1. تضارب إصدارات Kotlin stdlib
\n\nهذا هو ملك جميع التكرارات. عندما تقوم بتوصيل مكتبة تسحب نسختها الخاصة من kotlin-stdlib، وكان لديك بالفعل نسخة أخرى في مشروعك - يحدث تضارب.
مثال:
\n// build.gradle.kts (وحدة التطبيق)\ndependencies {\n implementation("org.jetbrains.kotlin:kotlin-stdlib:1.9.0")\n implementation("com.some.library:example:2.0.0") // هذه المكتبة تسحب kotlin-stdlib:1.8.0\n}\n\n\nسيظهر Gradle شيئًا مثل:
\nتم العثور على فئة مكررة kotlin.collections.ArraysKt في الوحدات kotlin-stdlib-1.9.0 (org.jetbrains.kotlin:kotlin-stdlib:1.9.0) و kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0)\n\n\nالحل: استخدم إصدارًا موحدًا من Kotlin للمشروع بأكمله. أفضل طريقة هي تعيينه في ملف build.gradle.kts الجذر:
// build.gradle.kts (الجذر)\nplugins {\n kotlin("android") version "1.9.0" apply false\n}\n\n// build.gradle.kts (وحدة التطبيق)\nplugins {\n kotlin("android")\n}\n\n\nيمكنك أيضًا استبعاد التبعية بشكل صريح:
\nimplementation("com.some.library:example:2.0.0") {\n exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")\n}\n\n\n2. تكرار AndroidX ومكتبة الدعم
\n\nكلاسيكي من هذا النوع. إذا كنت تستخدم مكتبات الدعم القديمة مع AndroidX، فإنها تحتوي على فئات متطابقة (مثل android.support.v4.app.Fragment و androidx.fragment.app.Fragment).
مثال على الخطأ:
\nتم العثور على فئة مكررة android.support.v4.app.Fragment في الوحدات support-compat-28.0.0 و fragment-1.6.0\n\n\nالحل:
\n- \n
- قم بتفعيل العلم
android.useAndroidX=trueفي ملفgradle.properties. \n - تأكد من أن جميع المكتبات قد تم ترحيلها إلى AndroidX. استخدم أداة الترحيل في Android Studio (Refactor > Migrate to AndroidX). \n
- إذا كانت المكتبة لا تدعم AndroidX، استخدم \n