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:
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:
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 Context
và WorkerParameters
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(); } }