Hilt มีส่วนขยายสำหรับการระบุคลาสจากไลบรารี Jetpack อื่นๆ ปัจจุบัน Hilt รองรับคอมโพเนนต์ Jetpack ต่อไปนี้
- Compose
ViewModel- การนำทาง
- WorkManager
คุณต้องเพิ่มทรัพยากร Dependency ของ 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 ภายในผู้ให้บริการสำหรับ 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.3.0") }
ดึงดูด
dependencies { ... implementation 'androidx.hilt:hilt-work:1.0.0' // When using Kotlin. ksp 'androidx.hilt:hilt-compiler:1.3.0' }
แทรก Worker โดยใช้คำอธิบายประกอบ
@HiltWorker ในคลาสและ @AssistedInject ในตัวสร้างออบเจ็กต์ Worker คุณใช้ได้เฉพาะการผูก @Singleton หรือการผูกที่ไม่ได้กำหนดขอบเขตในออบเจ็กต์ Worker นอกจากนี้ คุณยังต้องใส่คำอธิบายประกอบ @Assisted ในทรัพยากร Dependency Context และ WorkerParameters ด้วย
@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() }