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() }