فئة مكررة في Kotlin Android: أهم 5 أخطاء وحلول

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: "التوأم" في مشروعك

\n\n

تخيل الموقف: أنت تكتب كودًا بلغة Kotlin لتطبيق Android، كل شيء يعمل بشكل رائع. ثم تضيف مكتبة جديدة، وتشغل عملية البناء - ويظهر Gradle خطأ أحمر: "فئة مكررة". هل هذا مألوف؟ إذا سبق لك التعامل مع تطوير Android، فمن المحتمل أنك رأيت هذه الرسالة. على Stack Overflow، حصل هذا السؤال على آلاف المشاهدات، وليس من دون سبب - فالخطأ يمكن أن يحبط حتى المطورين ذوي الخبرة.

\n\n

في هذه المقالة، سنشرح ما هي الفئة المكررة في Kotlin Android، ولماذا تحدث، والأهم من ذلك - كيفية إصلاحها نهائيًا. ستتعرف على 5 من أكثر الأسباب شيوعًا، وستحصل على حلول جاهزة وستتعلم كيفية منع تضارب التبعيات. هيا بنا!

\n\n

ما هي الفئة المكررة ولماذا تحدث؟

\n\n

يحدث خطأ الفئة المكررة عندما يجد نظام البناء (Gradle) فئتين متطابقتين أو أكثر بنفس الاسم الكامل (FQN). في عالم Android، يعني هذا عادةً أن نفس الفئة موجودة في مكتبات أو وحدات مختلفة من مشروعك.

\n\n

تخيل أنك طلبت كتابين متطابقين، ولكن من ناشرين مختلفين. إنهما على نفس الرف - وأمين المكتبة لا يعرف أيهما يأخذ. هكذا هو Gradle: لا يمكنه تحديد أي من الفئات المكررة يجب استخدامها.

\n\n

لماذا هذا مهم بشكل خاص لـ Kotlin؟ يستخدم Kotlin بشكل نشط مكتبته القياسية (kotlin-stdlib)، والتي قد تتعارض مع إصداراتها من مصادر أخرى. أضف إلى ذلك AndroidX ومكتبات Google وFirebase - وستحصل على مزيج متفجر.

\n\n

أهم 5 أسباب لخطأ الفئة المكررة في Kotlin Android

\n\n

لقد جمعنا السيناريوهات الأكثر شيوعًا التي قد تواجهها في التطوير الفعلي. كل نقطة مصحوبة بمثال كود وحل.

\n\n

1. تضارب إصدارات Kotlin stdlib

\n\n

هذا هو ملك جميع التكرارات. عندما تقوم بتوصيل مكتبة تسحب نسختها الخاصة من kotlin-stdlib، وكان لديك بالفعل نسخة أخرى في مشروعك - يحدث تضارب.

\n\n

مثال:

\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 الجذر:

\n
// 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

يمكنك أيضًا استبعاد التبعية بشكل صريح:

\n
implementation("com.some.library:example:2.0.0") {\n    exclude(group = "org.jetbrains.kotlin", module = "kotlin-stdlib")\n}\n
\n\n

2. تكرار AndroidX ومكتبة الدعم

\n\n

كلاسيكي من هذا النوع. إذا كنت تستخدم مكتبات الدعم القديمة مع AndroidX، فإنها تحتوي على فئات متطابقة (مثل android.support.v4.app.Fragment و androidx.fragment.app.Fragment).

\n\n

مثال على الخطأ:

\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

المدونات

توصيات الكتب