0Pricing
Android Academy · درس

حقن التبعيات باستخدام Hilt

بسّطوا إدارة التبعيات باستخدام Hilt. استخدموا @HiltAndroidApp و@AndroidEntryPoint و@HiltViewModel و@Module و@Provides ونطاقات @Singleton.

حقن التبعيات باستخدام Hilt درس مجاني في Android Academy على CoddyKit. هذا هو الدرس 6 من أصل 6. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Android Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Android Academy 6 دروس في المجموع.

ما هو حقن الاعتماديات؟

يعني حقن الاعتماديات (DI) تزويد الكائن بما يحتاج إليه بدلًا من إنشاء الاعتماديات بنفسه.

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

حقن الاعتماديات اليدوي مقابل Hilt

يعمل حقن الاعتماديات اليدوي، لكنه يصبح مرهقًا عند توسع التطبيق:

// Manual DI — you create and pass everything:
val db = AppDatabase.getInstance(context)
val dao = db.userDao()
val repo = UserRepository(dao)
val factory = UserViewModel.Factory(repo)
val viewModel = ViewModelProvider(this, factory)[UserViewModel::class.java]

// With Hilt:
// Just annotate, Hilt does the wiring
@HiltViewModel
class UserViewModel @Inject constructor(private val repo: UserRepository) : ViewModel()

إضافة Hilt

أضف Hilt إلى مشروعك:

// project/build.gradle:
buildscript {
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.51'
    }
}

// app/build.gradle:
plugins {
    id 'com.google.dagger.hilt.android'
    id 'kotlin-kapt'
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.51'
    kapt 'com.google.dagger:hilt-android-compiler:2.51'
}

@HiltAndroidApp

أضف التعليق التوضيحي @HiltAndroidApp إلى فئة Application. هذه هي نقطة الدخول إلى بنية مكونات Hilt الهرمية:

@HiltAndroidApp
class MyApp : Application()

// Also register in AndroidManifest.xml:
// <application android:name=".MyApp" ...>

@AndroidEntryPoint

أضف @AndroidEntryPoint إلى Activities وFragments وServices التي تحتاج إلى اعتماديات محقونة:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var analytics: AnalyticsService

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        analytics.logEvent("app_open")
    }
}

@AndroidEntryPoint
class HomeFragment : Fragment() {
    // Fragment's parent Activity must also be @AndroidEntryPoint
}

@Inject — الحقن عبر المُنشئ

ضع التعليق التوضيحي @Inject على المُنشئ لإخبار Hilt بكيفية إنشاء الفئة. تحل Hilt جميع المعاملات تلقائيًا:

class UserRepository @Inject constructor(
    private val userDao: UserDao,
    private val apiService: ApiService
) {
    suspend fun getUsers() = userDao.getAll()
    suspend fun syncFromNetwork() {
        val users = apiService.fetchUsers()
        userDao.insertAll(users)
    }
}

// Hilt sees UserRepository needs UserDao and ApiService,
// and automatically creates and injects them.

@HiltViewModel

أضف التعليق التوضيحي @HiltViewModel إلى ViewModel واستخدم @Inject constructor. وفي Fragment، احصل عليه باستخدام by viewModels():

@HiltViewModel
class UserViewModel @Inject constructor(
    private val repo: UserRepository
) : ViewModel() {

    val users = repo.getUsersFlow().asLiveData()
}

// In Fragment:
@AndroidEntryPoint
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()  // Hilt provides it
}

@Module و @Provides

عندما يتعذر على Hilt استخدام الحقن عبر المُنشئ (مثل الواجهات والفئات التابعة لجهات خارجية)، وفر المثيلات من خلال @Module:

@Module
@InstallIn(SingletonComponent::class)   // lives for app lifetime
object NetworkModule {

    @Provides
    @Singleton
    fun provideRetrofit(): Retrofit {
        return Retrofit.Builder()
            .baseUrl("https://api.example.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
    }

    @Provides
    @Singleton
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }
}

@Binds — ربط الواجهة

استخدم @Binds لإخبار Hilt بالتنفيذ الذي ينبغي استخدامه لواجهة:

interface AnalyticsService {
    fun logEvent(name: String)
}

class FirebaseAnalytics @Inject constructor() : AnalyticsService {
    override fun logEvent(name: String) { /* Firebase impl */ }
}

@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {

    @Binds
    @Singleton
    abstract fun bindAnalytics(impl: FirebaseAnalytics): AnalyticsService
}

نطاقات Hilt

تتحكم النطاقات في مدة بقاء المثيل المحقون:

  • @Singleton — مثيل واحد طوال فترة تشغيل التطبيق (ApplicationComponent)
  • @ActivityRetainedScoped — يستمر عبر تغييرات الإعدادات
  • @ActivityScoped — مثيل واحد لكل Activity
  • @FragmentScoped — مثيل واحد لكل Fragment
  • @ViewModelScoped — مثيل واحد لكل ViewModel

الاختبار باستخدام Hilt

استبدل الاعتماديات الحقيقية ببدائل وهمية في الاختبارات باستخدام دعم Hilt للاختبار:

@HiltAndroidTest
class UserRepositoryTest {

    @get:Rule
    val hiltRule = HiltAndroidRule(this)

    @Inject
    lateinit var repo: UserRepository

    @Before
    fun setUp() {
        hiltRule.inject()
    }

    @Test
    fun usersAreFetched() {
        assertNotNull(repo)
    }
}

تحقّق سريع

أي تعليق توضيحي يخبر Hilt بإنشاء بنية مكونات DI للتطبيق بأكمله؟

مراجعة: حقن الاعتماديات باستخدام Hilt

تجعل Hilt حقن الاعتماديات شبه تلقائي في Android:

  • @HiltAndroidApp على فئة Application
  • @AndroidEntryPoint على Activities وFragments
  • @Inject constructor للفئات القابلة للحقن
  • @HiltViewModel + @Inject constructor لـ ViewModels
  • @Module + @Provides للفئات والواجهات التابعة لجهات خارجية
  • @Singleton لمشاركة مثيل واحد على مستوى التطبيق

التالي: الإشعارات الفورية باستخدام Firebase Cloud Messaging.

الأسئلة الشائعة

هل درس «حقن التبعيات باستخدام Hilt» مجاني؟

نعم — نص درس «حقن التبعيات باستخدام Hilt» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Android Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Android Academy 6 دروس في المجموع.

ماذا ستتعلم في «حقن التبعيات باستخدام Hilt»؟

بسّطوا إدارة التبعيات باستخدام Hilt. استخدموا @HiltAndroidApp و@AndroidEntryPoint و@HiltViewModel و@Module و@Provides ونطاقات @Singleton. تتمرن على Android Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Android Academy؟

لا تُشترط خبرة سابقة. Android Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 6 من أصل 6.

كم من الوقت يستغرق درس «حقن التبعيات باستخدام Hilt»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Android Academy هذا؟

نعم. كل درس في Android Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ViewModel وLiveData
  2. قاعدة بيانات Room
  3. Coroutines والدوال المعلّقة
  4. نمط Repository
  5. مكوّن Navigation
  6. حقن التبعيات باستخدام Hilt
← العودة إلى Android Academy