Hilt มีส่วนขยายสำหรับการจัดหาคลาสจากไลบรารี Jetpack อื่นๆ ปัจจุบัน Hilt รองรับคอมโพเนนต์ Jetpack ต่อไปนี้
- เขียน
ViewModel- การนำทาง
- WorkManager
คุณต้องเพิ่มการขึ้นต่อกันของ Hilt เพื่อใช้ประโยชน์จากการผสานรวมเหล่านี้ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่มทรัพยากร Dependency ได้ที่การแทรกทรัพยากร Dependency ด้วย 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() ... }
ใช้การแทรกที่ช่วยด้วย ViewModel
Hilt รองรับการแทรก ViewModel ที่มีการช่วยเหลือ การแทรกที่ช่วยจะช่วยให้คุณ
แทรกอาร์กิวเมนต์รันไทม์แบบไดนามิกพร้อมกับทรัพยากร Dependency ที่ 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 ให้มีขอบเขตที่ถูกต้องใน Back Stack ของการนำทาง ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบ Hilt เกี่ยวกับการแทรกที่ช่วย
@ViewModelScoped
ViewModelComponent จะจัดเตรียม Hilt ViewModel ทั้งหมดซึ่งเป็นไปตามวงจรเดียวกันกับ ViewModel และด้วยเหตุนี้จึงสามารถคงอยู่ได้แม้จะมีการเปลี่ยนแปลงการกำหนดค่า
หากต้องการกำหนดขอบเขตทรัพยากร Dependency ให้กับ ViewModel ให้ใช้คำอธิบายประกอบ @ViewModelScoped
@ViewModelScoped ประเภทจะทำให้มีการระบุอินสแตนซ์เดียวของประเภทที่กำหนดขอบเขตในทรัพยากร Dependency ทั้งหมดที่แทรกลงใน ViewModel
อินสแตนซ์อื่นๆ ของ ViewModel ที่ขออินสแตนซ์ที่กำหนดขอบเขตจะได้รับอินสแตนซ์อื่น
หากต้องแชร์อินสแตนซ์เดียวใน ViewModel ต่างๆ คุณควร
กำหนดขอบเขตโดยใช้ @ActivityRetainedScoped หรือ @Singleton
การผสานรวมกับไลบรารีการนำทางของ Jetpack
เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ 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
กำหนดขอบเขต ViewModel ให้กับ NavEntrys โดยใช้
rememberViewModelStoreNavEntryDecorator ใช้ hiltViewModel ภายใน
provider สำหรับ NavEntry นั้นเพื่อดึงข้อมูล ViewModel ที่เชื่อมโยง
NavDisplay(..., entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()), entryProvider = entryProvider { entry{ key -> val viewModel = hiltViewModel () MyScreen(viewModel = viewModel) } } )
ใน Navigation Compose ระบบจะกำหนดขอบเขต ViewModel ให้กับปลายทางการนำทางโดยอัตโนมัติ ดูข้อมูลเพิ่มเติมได้ที่Hilt และการนำทาง
val viewModel = hiltViewModel()
แทรก WorkManager ด้วย Hilt
เพิ่มทรัพยากร Dependency ต่อไปนี้ลงในไฟล์ Gradle โปรดทราบว่านอกเหนือจากไลบรารีแล้ว คุณยังต้องรวมโปรเซสเซอร์สำหรับคำอธิบายประกอบเพิ่มเติม ที่ทำงานบนโปรเซสเซอร์สำหรับคำอธิบายประกอบ 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 ในตัวสร้างออบเจ็กต์ Worker คุณใช้ได้เฉพาะการเชื่อมโยง @Singleton หรือการเชื่อมโยงที่ไม่มีขอบเขตในออบเจ็กต์ Worker นอกจากนี้ คุณต้องใส่คำอธิบายประกอบให้กับทรัพยากร Dependency 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() }