يتضمّن 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() }