استخدام Hilt مع مكتبات Jetpack الأخرى

تتضمّن Hilt إضافات لتوفير فئات من مكتبات Jetpack الأخرى. تتيح Hilt حاليًا استخدام مكوّنات Jetpack التالية:

  • إنشاء
  • ViewModel
  • التنقل
  • WorkManager

يجب إضافة تبعيات Hilt للاستفادة من عمليات الدمج هذه. لمزيد من المعلومات حول إضافة التبعيات، يُرجى الاطّلاع على حقن التبعية باستخدام Hilt.

الدمج مع Jetpack Compose

لمعرفة كيفية دمج Hilt مع Jetpack Compose، يُرجى الاطّلاع على قسم Hilt في Compose والمكتبات الأخرى.

حقن عناصر ViewModel باستخدام Hilt

قدِّم ViewModel من خلال إضافة تعليق توضيحي باستخدام @HiltViewModel واستخدام التعليق التوضيحي @Inject في الدالة الإنشائية للكائن ViewModel.

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

بعد ذلك، يمكن لأي نشاط تمّت إضافة تعليق توضيحي إليه باستخدام @AndroidEntryPoint الحصول على مثيل ViewModel كالمعتاد باستخدام ViewModelProvider أو by viewModels() إضافات KTX:

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

استخدام الحقن المساعد مع ViewModels

تتيح Hilt استخدام ميزة "الحقن بمساعدة" (assisted injection) في ViewModels. يتيح لك الحقن المساعد حقن وسيطات وقت التشغيل الديناميكية إلى جانب التبعيات التي يديرها Hilt. لاستخدام الحقن المساعد، يمكنك إضافة تعليق توضيحي إلى دالة ViewModel باستخدام @AssistedInject، ووضع علامة على المَعلمات الديناميكية باستخدام @Assisted. يجب أيضًا تحديد واجهة @AssistedFactory التي تعمل كجسر لـ Hilt لإنشاء @ViewModelProvider.Factory اللازمة تلقائيًا.

@HiltViewModel(assistedFactory = MyViewModel.Factory::class)
class MyViewModel @AssistedInject constructor(
    @Assisted val userId: String,
    private val repository: MyRepository
) : ViewModel() {
    @AssistedFactory interface Factory {
        fun create(userId: String): MyViewModel
    }
}

في Compose، يمكنك استخدام المصنع المساعد من خلال تمريره إلى دالة hiltViewModel أثناء التنقّل أو إعداد الشاشة. يغنيك هذا الأسلوب عن الحاجة إلى استخدام الرموز النموذجية اليدوية في المصنع مع الحفاظ على نطاق ViewModel بشكل صحيح ضمن الأنشطة السابقة للتنقّل. لمزيد من المعلومات، يُرجى الاطّلاع على مستندات Hilt حول الحقن بمساعدة.

@ViewModelScoped

يتم توفير جميع نماذج عرض Hilt من خلال ViewModelComponent الذي يتّبع مراحل النشاط نفسها مثل ViewModel، وبالتالي يمكنه الاحتفاظ بالبيانات عند تغيير الإعدادات. لتحديد نطاق تبعية لـ ViewModel، استخدِم التعليق التوضيحي @ViewModelScoped.

سيؤدي استخدام النوع @ViewModelScoped إلى توفير مثيل واحد من النوع المحدّد النطاق في جميع التبعيات التي يتم إدخالها في ViewModel. وستتلقّى النُسخ الأخرى من ViewModel التي تطلب النسخة المحدّدة النطاق نسخة مختلفة.

إذا كان يجب مشاركة مثيل واحد في عدة نماذج عرض، يجب تحديد نطاقه باستخدام @ActivityRetainedScoped أو @Singleton.

التكامل مع مكتبات التنقّل في Jetpack

أضِف التبعيات الإضافية التالية إلى ملف Gradle:

app/build.gradle

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0")
}

أنيق

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

في Jetpack Compose، تستخدم مكتبتا Navigation Compose وNavigation 3 دالة hiltViewModel لاسترداد ViewModel تلقائيًا ضمن نطاق وجهة التنقّل الحالية.

في Navigation 3، يتم تمثيل وجهات التنقّل باستخدام NavEntry. تحديد نطاق ViewModels على NavEntry باستخدام rememberViewModelStoreNavEntryDecorator. استخدِم hiltViewModel داخل مقدّم الخدمة لـ NavEntry من أجل استرداد ViewModel المرتبط.

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

في Navigation Compose، يتم تحديد نطاق ViewModels تلقائيًا لوجهات التنقّل. لمزيد من المعلومات، يُرجى الاطّلاع على Hilt والتنقّل.

val viewModel = hiltViewModel()

حقن WorkManager باستخدام Hilt

أضِف التبعيات الإضافية التالية إلى ملف Gradle. يُرجى العِلم أنّه بالإضافة إلى المكتبة، عليك تضمين معالج تعليقات توضيحية إضافي يعمل فوق معالج التعليقات التوضيحية في Hilt:

app/build.gradle

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    ksp("androidx.hilt:hilt-compiler:1.4.0")
}

أنيق

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.4.0'
}

يمكنك إدخال Worker باستخدام التعليق التوضيحي @HiltWorker في الفئة و@AssistedInject في الدالة الإنشائية للكائن Worker. يمكنك استخدام @Singleton فقط أو عمليات الربط غير المحدودة النطاق في كائنات Worker. يجب أيضًا إضافة تعليقات توضيحية إلى الاعتماديتَين Context وWorkerParameters باستخدام @Assisted:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

بعد ذلك، اطلب من فئة Application تنفيذ واجهة Configuration.Provider، وإدخال مثيل HiltWorkFactory، وتمريره إلى إعدادات WorkManager على النحو التالي:

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}