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 از تزریق کمکی برای 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 ViewModels توسط ViewModelComponent ارائه میشوند که از همان چرخه حیات ViewModel پیروی میکند و بنابراین میتواند دربرابر تغییرات پیکربندی دوام بیاورد.
برای محدود کردن وابستگی به ViewModel، از حاشیهنویسی @ViewModelScoped استفاده کنید.
نوع @ViewModelScoped باعث میشود که یک نمونه واحد از نوع محدودشده
در سراسر همه وابستگیهای تزریقشده به ViewModel ارائه شود.
سایر نمونههای ViewModel که نمونه محدودشده را درخواست میکنند، نمونه متفاوتی دریافت خواهند کرد.
اگر لازم است یک نمونه در ViewModelهای مختلف همرسانی شود، باید بااستفاده از @ActivityRetainedScoped یا @Singleton محدود شود.
ادغام با کتابخانههای پیمایش Jetpack
وابستگیهای اضافی زیر را به فایل Gradle خود اضافه کنید:
app/build.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
محدود به مقصد پیمایش فعلی استفاده میکنند.
در Navigation 3، مقصدهای ناوبری با NavEntry نشان داده میشوند.
Scope ViewModels to NavEntrys using
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
کاتلین
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' }
بااستفاده از حاشیهنویسی @HiltWorker در کلاس و @AssistedInject در سازنده شیء Worker، Worker را تزریق کنید. در اشیای Worker فقط میتوانید از اتصالهای @Singleton یا بدون محدوده استفاده کنید. همچنین باید وابستگیهای 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() }