استفاده از 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() {
  ...
}

سپس، فعالیتی که با @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()
}