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

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

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

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

التكامل مع Jetpack Compose

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

إدخال كائنات ViewModel باستخدام Hilt

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

@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 ميزة "الإدخال بمساعدة" لـ ViewModels. تسمح لك ميزة "الإدخال بمساعدة" بإدخال وسيطات وقت التشغيل الديناميكية إلى جانب التبعيات التي يديرها 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

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

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

إذا كان يجب مشاركة مثيل واحد بين ViewModels مختلفة، يجب تحديد نطاقه باستخدام @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، يتم تمثيل وجهات التنقّل من خلال NavEntrys. يمكنك تحديد نطاق 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.3.0")
}

أنيق

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

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

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