Dùng Hilt với các thư viện Jetpack khác

Hilt bao gồm các tiện ích mở rộng để cung cấp các lớp từ những thư viện Jetpack khác. Hilt hiện hỗ trợ các thành phần Jetpack sau:

  • Soạn thư
  • ViewModel
  • Điều hướng
  • WorkManager

Bạn phải thêm các phần phụ thuộc của Hilt để tận dụng các tính năng tích hợp này. Để biết thêm thông tin về cách thêm các phần phụ thuộc, vui lòng xem bài viết Sử dụng Hilt để chèn phần phụ thuộc.

Tích hợp với Jetpack Compose

Để biết cách Hilt tích hợp với Jetpack Compose, vui lòng xem phần Hilt của Compose và các thư viện khác.

Chèn đối tượng ViewModel bằng Hilt

Cung cấp ViewModel bằng cách dùng @HiltViewModel chú thích lớp này, đồng thời sử dụng chú thích @Inject trong hàm khởi tạo của đối tượng ViewModel.

@HiltViewModel
class ExampleViewModel @Inject constructor(
  private val savedStateHandle: SavedStateHandle,
  private val repository: ExampleRepository
) : ViewModel() {
  ...
}

Sau đó, một hoạt động được chú thích bằng @AndroidEntryPoint có thể nhận thực thể ViewModel như bình thường bằng cách sử dụng ViewModelProvider hoặc by viewModels() tiện ích KTX:

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

Sử dụng kiểu chèn được hỗ trợ với ViewModel

Hilt hỗ trợ tính năng chèn được hỗ trợ cho ViewModel. Kiểu chèn được hỗ trợ cho phép bạn chèn các đối số thời gian chạy động cùng với các phần phụ thuộc do Hilt quản lý. Để sử dụng tính năng chèn được hỗ trợ, hãy chú thích hàm khởi tạo ViewModel bằng @AssistedInject và đánh dấu các tham số động bằng @Assisted. Bạn cũng phải xác định một giao diện @AssistedFactory, đóng vai trò là cầu nối để Hilt tự động tạo @ViewModelProvider.Factory cần thiết.

@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
    }
}

Trong Compose, bạn có thể sử dụng assisted factory bằng cách truyền assisted factory vào hàm hiltViewModel trong quá trình Điều hướng hoặc khởi động màn hình. Phương pháp này giúp bạn không cần phải đặt lại về trạng thái ban đầu theo cách thủ công, đồng thời vẫn giữ ViewModel được đặt phạm vi chính xác cho ngăn xếp lui của thao tác điều hướng. Để biết thêm thông tin, hãy xem tài liệu về Hilt liên quan đến hoạt động chèn được hỗ trợ.

@ViewModelScoped

Tất cả các ViewModel của Hilt đều được cung cấp bởi ViewModelComponent tuân theo cùng một vòng đời như ViewModel, và do đó có thể duy trì thay đổi về cấu hình. Để đặt phạm vi của một phần phụ thuộc vào ViewModel, hãy sử dụng chú thích @ViewModelScoped.

Loại @ViewModelScoped sẽ được tạo để một bản sao của loại có phạm vi được cung cấp trên tất cả các phần phụ thuộc được chèn vào ViewModel. Các bản sao khác của ViewModel yêu cầu bản sao nằm trong phạm vi sẽ nhận được một bản sao khác.

Nếu một bản sao riêng lẻ cần được chia sẻ trên nhiều ViewModel, thì bản sao đó phải được giới hạn trong phạm vi bằng cách sử dụng @ActivityRetainedScoped hoặc @Singleton.

Tích hợp với các thư viện điều hướng Jetpack

Thêm các phần phụ thuộc bổ sung sau đây vào tệp Gradle của bạn:

app/build.gradle

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0")
}

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel-compose:1.3.0'
}

Trong Jetpack Compose, cả thư viện Navigation Compose và Navigation 3 đều sử dụng hàm hiltViewModel để tự động truy xuất một ViewModel thuộc phạm vi đích đến điều hướng hiện tại.

Trong Navigation 3, các đích đến điều hướng được biểu thị bằng NavEntry. Phạm vi ViewModel đến NavEntrys bằng cách sử dụng rememberViewModelStoreNavEntryDecorator. Sử dụng hiltViewModel bên trong trình cung cấp cho NavEntry đó để truy xuất ViewModel được liên kết.

NavDisplay(...,
  entryDecorators = listOf(..., rememberViewModelStoreNavEntryDecorator()),
  entryProvider = entryProvider {
    entry { key ->
      val viewModel = hiltViewModel()
      MyScreen(viewModel = viewModel)
    }
  }
)

Trong Navigation Compose, các ViewModel sẽ tự động được đặt phạm vi cho các đích đến điều hướng. Để biết thêm thông tin, hãy xem phần Hilt và Navigation.

val viewModel = hiltViewModel()

Chèn WorkManager bằng Hilt

Thêm các phần phụ thuộc bổ sung sau đây vào tệp Gradle của bạn: Vui lòng lưu ý ngoài thư viện, bạn cần đưa vào thêm một trình xử lý chú thích hoạt động trên trình xử lý chú thích của 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")
}

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  ksp 'androidx.hilt:hilt-compiler:1.3.0'
}

Chèn Worker bằng cách sử dụng chú thích @HiltWorker trong lớp và @AssistedInject trong hàm khởi tạo của đối tượng Worker. Bạn chỉ có thể sử dụng @Singleton hoặc các liên kết không theo phạm vi của các đối tượng Worker. Bạn cũng phải chú thích các phần phụ thuộc ContextWorkerParameters bằng @Assisted:

@HiltWorker
class ExampleWorker @AssistedInject constructor(
  @Assisted appContext: Context,
  @Assisted workerParams: WorkerParameters,
  workerDependency: WorkerDependency
) : Worker(appContext, workerParams) { ... }

Sau đó, hãy để lớp Application của bạn triển khai giao diện Configuration.Provider, chèn một bản sao của HiltWorkFactory và truyền nó vào cấu hình WorkManager như bên dưới:

@HiltAndroidApp
class ExampleApplication : Application(), Configuration.Provider {

  @Inject lateinit var workerFactory: HiltWorkerFactory

  override fun getWorkManagerConfiguration() =
      Configuration.Builder()
            .setWorkerFactory(workerFactory)
            .build()
}