שימוש ב-Hilt עם ספריות אחרות של Jetpack

‫Hilt כולל תוספים שמספקים מחלקות מספריות Jetpack אחרות. ‫Hilt תומך כרגע ברכיבי Jetpack הבאים:

  • אימייל חדש
  • ViewModel
  • ניווט
  • WorkManager

כדי להשתמש בשילובים האלה, צריך להוסיף את יחסי התלות של Hilt. מידע נוסף על הוספת יחסי תלות זמין במאמר החדרת יחסי תלות באמצעות Hilt.

שילוב עם Jetpack Compose

כדי לראות איך Hilt משתלב עם Jetpack Compose, אפשר לעיין בקטע בנושא Hilt במאמר Compose וספריות אחרות.

הזרקת אובייקטים של ViewModel באמצעות Hilt

מציינים ViewModel באמצעות הוספת הערה עם @HiltViewModel ושימוש בהערה @Inject ב-constructor של האובייקט 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 constructor באמצעות @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, אתם יכולים להשתמש ב-assisted factory על ידי העברה שלו לפונקציה hiltViewModel במהלך הניווט או האתחול של המסך. הגישה הזו מייתרת את הצורך בתבנית ידנית של Factory, תוך שמירה על ViewModel בהיקף הנכון של מקבץ הפעילויות הקודמות (back stack) של הניווט. מידע נוסף זמין במסמכי התיעוד של 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, יעדי הניווט מיוצגים על ידי NavEntry. הגדרת ההיקף של ViewModels ל-NavEntry באמצעות rememberViewModelStoreNavEntryDecorator. משתמשים ב-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. שימו לב שבנוסף לספרייה, צריך לכלול מעבד אנוטציות (Annotation processor) נוסף שפועל מעל מעבד האנוטציות של Hilt:

app/build.gradle

Kotlin

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'
}

מזריקים Worker באמצעות ההערה @HiltWorker במחלקה ו-@AssistedInject ב-constructor של האובייקט 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()
}