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

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