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

Hilt มีส่วนขยายสำหรับการจัดเตรียมคลาสจากไลบรารี Jetpack อื่นๆ ปัจจุบัน Hilt รองรับคอมโพเนนต์ Jetpack ต่อไปนี้

  • เขียน
  • 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 หรือส่วนขยาย KTX by viewModels() ดังนี้

@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
  private val exampleViewModel: ExampleViewModel by viewModels()
  ...
}

ใช้การแทรกที่ได้รับความช่วยเหลือกับ ViewModels

Hilt รองรับการแทรกที่ได้รับความช่วยเหลือสำหรับ ViewModel การแทรกที่ได้รับความช่วยเหลือช่วยให้คุณแทรกอาร์กิวเมนต์รันไทม์แบบไดนามิกควบคู่ไปกับการขึ้นต่อกันที่จัดการโดย 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 คุณสามารถใช้ Assisted Factory โดยส่งไปยังฟังก์ชัน hiltViewModel ระหว่างการนำทางหรือการเริ่มต้นหน้าจอ วิธีนี้ช่วยลดความจำเป็นในการใช้ Boilerplate ของ Factory ด้วยตนเอง ขณะเดียวกันก็ยังคงกำหนดขอบเขต ViewModel ให้กับ Back Stack ของการนำทางได้อย่างถูกต้อง ดูข้อมูลเพิ่มเติมได้ที่เอกสารประกอบของ Hilt เกี่ยวกับการแทรกที่ได้รับความช่วยเหลือ

@ViewModelScoped

ViewModel ของ Hilt ทั้งหมดมาจาก ViewModelComponent ซึ่งเป็นไปตามวงจรเดียวกันกับ ViewModel จึงคงอยู่ได้แม้จะมีการเปลี่ยนแปลงการกำหนดค่า หากต้องการกำหนดขอบเขตทรัพยากร Dependency เป็น ViewModel ให้ใช้คำอธิบายประกอบ @ViewModelScoped

ประเภท @ViewModelScoped จะทำให้มีการระบุอินสแตนซ์เดียวของประเภทที่กำหนดขอบเขตไว้ในการขึ้นต่อกันทั้งหมดที่แทรกเข้าไปใน 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 เป็น NavEntry โดยใช้ 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.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()
}