Anvil مع Kotlin: دليل شامل مع أمثلة عملية

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

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

ابدأ الدورة

Anvil مع Kotlin: دليل شامل مع أمثلة عملية

1. ما هي مكتبة Anvil ولماذا تحتاجها؟

Anvil هي مكتبة لتوليد الأكواد البرمجية (Code Generation) في Kotlin، تعمل فوق أُطر حقن التبعية (DI) مثل Dagger و Hilt. هدفها الأساسي هو التخلص من العمل الروتيني لكتابة الكود المتكرر (Boilerplate Code) المرتبط بوحدات DI والمكونات والمصانع ونقاط الدخول. بدلاً من إنشاء وحدات Dagger يدويًا وإضافة التعليقات التوضيحية (Annotations) لها، كل ما عليك فعله هو وضع تعليقات Anvil على كلاساتك، وستقوم المكتبة بتوليد كل الكود المطلوب تلقائيًا أثناء مرحلة الترجمة (Compilation).

لماذا تحتاج إليها؟ في المشاريع الكبيرة على Android أو Kotlin Multiplatform، قد يصل عدد الكلاسات التي تحتاج إلى تسجيلها في رسم بياني للتبعيات (Dependency Graph) إلى المئات. في كل مرة تضيف وحدة Dagger جديدة وتكتب @Provides أو @Binds، تكون هذه العملية بطيئة وعرضة للأخطاء وتُعقّد عملية إعادة الهيكلة (Refactoring). Anvil تحل هذه المشكلة عن طريق أتمتة إنشاء الوحدات بناءً على تعليقات توضيحية بسيطة. هذا مفيد بشكل خاص في البنية المعتمدة على وحدات الميزات (Feature Modules)، حيث يجب أن تكون كل وحدة قابلة للبناء والاختبار بشكل مستقل.

تتكامل Anvil بشكل وثيق مع Gradle وتستخدم Kotlin Symbol Processing (KSP) أو KAPT لتوليد الكود. وهي تدعم كلاً من Dagger و Hilt، ويمكنها العمل في المشاريع متعددة المنصات (Multiplatform). تم تطوير المكتبة بواسطة شركة Square، المعروفة بأدواتها لتطوير Android مثل Retrofit و OkHttp و Moshi.

2. طريقة التثبيت

لتثبيت Anvil في مشروع Kotlin/Gradle الخاص بك، أضف التبعيات التالية إلى ملف build.gradle.kts (على مستوى جذر المشروع):

// في ملف build.gradle.kts الجذري
plugins {
    id("com.google.dagger.hilt.android") version "2.48" apply false
    id("com.squareup.anvil") version "2.4.7" apply false
}

ثم في وحدة التطبيق (مثلاً app/build.gradle.kts):

plugins {
    id("com.android.application")
    kotlin("android")
    id("com.google.dagger.hilt.android")
    id("com.squareup.anvil")
}

android {
    // ... إعدادات Android الخاصة بك
}

dependencies {
    // Hilt
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48")

    // Anvil
    implementation("com.squareup.anvil:annotations:2.4.7")
    ksp("com.squareup.anvil:compiler:2.4.7") // أو استخدم kapt إذا كنت لا تستخدم KSP
}

إذا كنت تستخدم KSP بدلاً من KAPT، تأكد من إضافة إضافة KSP:

plugins {
    id("com.google.devtools.ksp") version "1.9.0-1.0.13"
}

بعد مزامنة Gradle، تصبح Anvil جاهزة للعمل.

3. بداية سريعة — مثال عملي بسيط

لنأخذ مثالاً بسيطاً: لدينا كلاس UserRepository نريد حقنه في MainViewModel.

الخطوة 1: أنشئ واجهة (Interface) أو كلاساً سيتم حقنه:

// UserRepository.kt
class UserRepository @Inject constructor() {
    fun getUser(): String = "John Doe"
}

الخطوة 2: أنشئ كلاساً سيستخدم التبعية:

// MainViewModel.kt
class MainViewModel @Inject constructor(
    private val userRepository: UserRepository
) {
    fun getUserName(): String = userRepository.getUser()
}

الخطوة 3: أنشئ مكون Hilt (أو Dagger) باستخدام Anvil:

// AppComponent.kt
@Singleton
@Component
@MergeComponent(AppScope::class) // تعليق Anvil
interface AppComponent {
    fun inject(app: MyApplication)
}

// AppScope.kt (نحدد النطاق)
@Scope
@MustBeDocumented
annotation class AppScope

الخطوة 4: سجل الكلاسات في الرسم البياني للتبعيات باستخدام تعليقات Anvil:

// UserRepository.kt (تمت الإضافة)

توصيات