ใช้ Hilt กับไลบรารี Jetpack อื่นๆ

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