Hilt شامل افزونههایی برای ارائه کلاسها از سایر کتابخانههای Jetpack است. Hilt در حال حاضر از اجزای Jetpack زیر پشتیبانی میکند:
- نوشتن
-
ViewModel - ناوبری
- مدیر کار
You must add the Hilt dependencies to take advantage of these integrations. For more information about adding dependencies, see Dependency injection with Hilt .
ادغام با Jetpack Compose
برای مشاهدهی نحوهی ادغام Hilt با Jetpack Compose، به بخش Hilt از Compose و سایر کتابخانهها مراجعه کنید.
تزریق اشیاء ViewModel با Hilt
با حاشیهنویسی آن با @HiltViewModel و استفاده از حاشیهنویسی @Inject در سازندهی شیء ViewModel ، یک ViewModel ایجاد کنید.
@HiltViewModel class ExampleViewModel @Inject constructor( private val savedStateHandle: SavedStateHandle, private val repository: ExampleRepository ) : ViewModel() { ... }
Then, an activity that is annotated with @AndroidEntryPoint can get the ViewModel instance as normal using ViewModelProvider or the by viewModels() KTX extensions :
@AndroidEntryPoint class ExampleActivity : AppCompatActivity() { private val exampleViewModel: ExampleViewModel by viewModels() ... }
استفاده از تزریق کمکی با ViewModels
Hilt از تزریق کمکی برای ViewModelها پشتیبانی میکند. تزریق کمکی به شما امکان میدهد آرگومانهای پویای زمان اجرا را در کنار وابستگیهای مدیریتشده توسط 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، میتوانید با ارسال factory کمکی به تابع hiltViewModel در حین ناوبری یا مقداردهی اولیه صفحه، از آن استفاده کنید. این رویکرد نیاز به کدهای آماده factory دستی را از بین میبرد و در عین حال ViewModel شما را به درستی در پشته ناوبری نگه میدارد. برای اطلاعات بیشتر، به مستندات Hilt در مورد تزریق کمکی مراجعه کنید.
@ViewModelScoped
تمام Hilt ViewModelها توسط ViewModelComponent ارائه میشوند که از همان چرخه حیات ViewModel پیروی میکند و به همین دلیل میتواند در برابر تغییرات پیکربندی مقاوم باشد. برای محدود کردن یک وابستگی به ViewModel از حاشیهنویسی @ViewModelScoped استفاده کنید.
یک نوع @ViewModelScoped باعث میشود که یک نمونه واحد از نوع scoped در تمام وابستگیهای تزریق شده به ViewModel ارائه شود. نمونههای دیگر ViewModel که نمونه scoped را درخواست میکنند، نمونه متفاوتی دریافت خواهند کرد.
اگر لازم باشد یک نمونه واحد بین ViewModel های مختلف به اشتراک گذاشته شود، باید با استفاده از @ActivityRetainedScoped یا @Singleton محدودهبندی شود.
Integration with the Jetpack navigation libraries
وابستگیهای اضافی زیر را به فایل Gradle خود اضافه کنید:
برنامه/ساخت.gradle
کاتلین
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 که به مقصد ناوبری فعلی محدود شده است، استفاده میکنند.
در ناوبری ۳، مقصدهای ناوبری توسط NavEntry ها نمایش داده میشوند. با استفاده از rememberViewModelStoreNavEntryDecorator ، ViewModelها را به NavEntry ها محدود کنید . از hiltViewModel درون ارائهدهندهی آن NavEntry برای بازیابی ViewModel مرتبط استفاده کنید.
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
در Navigation Compose، ViewModelها به طور خودکار به مقصدهای ناوبری محدود میشوند. برای اطلاعات بیشتر، به Hilt و Navigation مراجعه کنید.
val viewModel = hiltViewModel()
تزریق WorkManager با Hilt
وابستگیهای اضافی زیر را به فایل Gradle خود اضافه کنید. توجه داشته باشید که علاوه بر کتابخانه، باید یک پردازنده حاشیهنویسی اضافی که بر روی پردازنده حاشیهنویسی Hilt کار میکند را نیز اضافه کنید:
برنامه/ساخت.gradle
کاتلین
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' }
با استفاده از حاشیهنویسی @HiltWorker در کلاس و @AssistedInject در سازندهی شیء Worker ، یک 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() }