مقدمة في حقن التبعيات ومكتبات Hilt/Dagger
\n\nفي تطوير التطبيقات الحديثة باستخدام Kotlin (خاصةً لنظام Android)، يُعد حقن التبعيات (Dependency Injection - DI) أحد المفاهيم المعمارية الأساسية. وهو نمط تصميم يحصل فيه الكائن على تبعياته من الخارج، بدلاً من إنشائها بنفسه. وهذا يجعل الكود أكثر مرونة، وقابلية للاختبار، وسهولة في الصيانة.
\n\nDagger هو إطار عمل قوي لحقن التبعيات، طورته Google، ويقوم بإنشاء الكود في مرحلة الترجمة. يضمن توفير جميع التبعيات بشكل صحيح، ويمنع أخطاء وقت التشغيل المرتبطة بغياب التبعيات. ومع ذلك، يتمتع Dagger بمنحنى تعلم حاد بسبب تعقيده.
\n\nHilt هو طبقة فوقية فوق Dagger، تم إنشاؤها لتبسيط استخدامه في تطبيقات Android. يوفر Hilt مكونات قياسية، وتعليقات توضيحية للنطاق، وتكاملاً تلقائياً مع دورة حياة Android (Activity، Fragment، ViewModel، إلخ). إذا كنت تكتب بلغة Kotlin لتطبيقات Android، فإن Hilt هو الخيار الموصى به، لأنه يقلل بشكل كبير من الكود النمطي (boilerplate).
\n\nفي هذه المقالة، سنستعرض بالتفصيل كلتا المكتبتين، لكننا سنركز بشكل أساسي على Hilt باعتبارها الأداة الأكثر حداثة وراحة. ستتعلم كيفية تثبيت Hilt، وكيفية استخدام تعليقاته التوضيحية وطرقه الأساسية، وسنحلل أمثلة واقعية وأخطاء شائعة.
\n\nتثبيت Hilt في مشروع Kotlin/Android
\n\nلا يتم تثبيت Hilt عبر pip أو npm. بل يتم دمجه في مشروع Gradle. بالنسبة لـ Kotlin وAndroid، تكون العملية كالتالي:
\n\n1. إضافة إضافة Hilt في ملف build.gradle الجذر (على مستوى المشروع)
\n// build.gradle (Project)\nbuildscript {\n repositories {\n google()\n mavenCentral()\n }\n dependencies {\n // ... إضافات أخرى\n classpath 'com.google.dagger:hilt-android-gradle-plugin:2.50' // تحقق من الإصدار الأحدث\n }\n}\n\n\n2. تطبيق الإضافة في ملف build.gradle لوحدة التطبيق (على مستوى الوحدة)
\n// build.gradle (Module: app)\nplugins {\n id 'com.android.application'\n id 'org.jetbrains.kotlin.android'\n id 'kotlin-kapt' // إلزامي لـ Hilt\n id 'dagger.hilt.android.plugin'\n}\n\nandroid {\n // ... إعداداتك\n}\n\ndependencies {\n implementation 'com.google.dagger:hilt-android:2.50'\n kapt 'com.google.dagger:hilt-compiler:2.50'\n\n // لـ ViewModel (اختياري، لكن موصى به)\n implementation 'androidx.hilt:hilt-navigation-compose:1.1.0' // لـ Jetpack Compose\n // أو\n implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03' // للإصدارات القديمة\n}\n\n\n3. إعداد فئة Application
\nيجب أن يحتوي كل تطبيق يستخدم Hilt على فئة Application مُعلّقة بـ @HiltAndroidApp.
import android.app.Application\nimport dagger.hilt.android.HiltAndroidApp\n\n@HiltAndroidApp\nclass MyApplication : Application() {\n override fun onCreate() {\n super.onCreate()\n // تهيئة التطبيق\n }\n}\n\nلا تنسَ تحديد هذه الفئة في ملف AndroidManifest.xml:
<application\n android:name=".MyApplication"\n ... >\n\n\nبداية سريعة مع مثال كود
\n\nلنقم بإنشاء مثال بسيط: تطبيق يُحيي المستخدم، باستخدام Hilt لحقن تبعية Greeter.
الخطوة 1: إنشاء الفئة التي سيتم حقنها
\nimport javax.inject.Inject\n\nclass Greeter @Inject constructor() {\n fun greet(name: String): String {\n return "Hello, $name!"\n }\n}\n\nالتعليق التوضيحي @Inject على المُنشئ يُخبر Hilt بكيفية إنشاء نسخة من هذه الفئة.
الخطوة 2: الحقن في Activity
\nimport android.os.Bundle\nimport android.widge