استخدام 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() {
  ...
}

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

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

استخدام ميزة "إدخال البيانات بمساعدة" مع ViewModels

يتيح Hilt إمكانية إجراء عملية الربط بمساعدة ViewModel. تتيح لك ميزة "إدخال الاعتمادية المساعد" إدخال وسيطات وقت التشغيل الديناميكية إلى جانب الاعتمادات التي تديرها Hilt. لاستخدام ميزة "توفير التبعية بمساعدة"، أضِف التعليق التوضيحي @AssistedInject إلى الدالة الإنشائية الخاصة بـ ViewModel، وضَع العلامة @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 ViewModels من خلال ViewModelComponent الذي يتّبع دورة الحياة نفسها التي يتّبعها ViewModel، وبالتالي يمكنه البقاء على قيد التشغيل عند حدوث تغييرات في الإعدادات. لتحديد نطاق الاعتمادية في ViewModel، استخدِم التعليق التوضيحي @ViewModelScoped.

سيؤدي استخدام النوع @ViewModelScoped إلى توفير مثيل واحد من النوع المحدود النطاق في جميع التبعيات التي يتم إدخالها في ViewModel. ستتلقّى مثيلات أخرى من 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 على NavEntrys باستخدام rememberViewModelStoreNavEntryDecorator استخدِم hiltViewModel داخل موفّر NavEntry لاسترداد ViewModel المرتبط.

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

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

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()
}