Sử dụng Hilt với các thư viện Jetpack khác

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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:

  • ViewModel
  • Điều hướng
  • Compose
  • 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.

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.

Kotlin

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

Java

@HiltViewModel
public class ExampleViewModel extends ViewModel {

  private final ExampleRepository repository;
  private final SavedStateHandle savedStateHandle;

  @Inject
  ExampleViewModel(
      SavedStateHandle savedStateHandle,
      ExampleRepository repository)
    {
    this.savedStateHandle = savedStateHandle;
    this.repository = repository;
  }
  ...
}

Sau đó, một hoạt động hoặc mảnh đượ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:

Kotlin

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

Java

@AndroidEntryPoint
public class ExampleActivity extends AppCompatActivity {

  private ExampleViewModel exampleViewModel;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    exampleViewModel = new ViewModelProvider(this).get(ExampleViewModel.class);
  }
  ...
}

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

Groovy

dependencies {
    ...
    implementation 'androidx.hilt:hilt-navigation-fragment:1.0.0'
}

Kotlin

dependencies {
    ...
    implementation("androidx.hilt:hilt-navigation-fragment:1.0.0")
}

Nếu ViewModel của bạn thuộc phạm vi của biểu đồ điều hướng, hãy sử dụng hàm hiltNavGraphViewModels hoạt động với các mảnh được chú thích bằng @AndroidEntryPoint.

Kotlin

val viewModel: ExampleViewModel by hiltNavGraphViewModels(R.id.my_graph)

Java

NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.my_graph);

ExampleViewModel exampleViewModel = new ViewModelProvider(
  backStackEntry,
  HiltViewModelFactory.create(context, backStackEntry)
).get(ExampleViewModel.class)

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

Groovy

dependencies {
  ...
  implementation 'androidx.hilt:hilt-work:1.0.0'
  // When using Kotlin.
  kapt 'androidx.hilt:hilt-compiler:1.0.0'
  // When using Java.
  annotationProcessor 'androidx.hilt:hilt-compiler:1.0.0'
}

Kotlin

dependencies {
    implementation("androidx.hilt:hilt-work:1.0.0")
    // When using Kotlin.
    kapt("androidx.hilt:hilt-compiler:1.0.0")
    // When using Java.
    annotationProcessor("androidx.hilt:hilt-compiler:1.0.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:

Kotlin

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

Java

@HiltWorker
public class ExampleWorker extends Worker {

  private final WorkerDependency workerDependency;

  @AssistedInject
  ExampleWorker(
    @Assisted @NonNull Context context,
    @Assisted @NonNull WorkerParameters params,
    WorkerDependency workerDependency
  ) {
    super(context, params);
    this.workerDependency = workerDependency;
  }
  ...
}

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:

Kotlin

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

  @Inject lateinit var workerFactory: HiltWorkerFactory

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

Java

@HiltAndroidApp
public class ExampleApplication extends Application implements Configuration.Provider {

  @Inject HiltWorkerFactory workerFactory;

  @Override
  public Configuration getWorkManagerConfiguration() {
    return new Configuration.Builder()
             .setWorkerFactory(workerFactory)
             .build();
  }
}