Di chuyển từ Dagger2 sang Hilt trong dự án đa mô-đun
Hướng dẫn từng bước để di chuyển từ Dagger
sang Hilt
trong một dự án đa mô-đun.
Cấu trúc dự án
Để trực quan hóa dự án, nó chứa nhiều mô-đun NetworkModule, StorageModule, CommonModule, FeatureModule, v.v. Trong các dự án thực tế, có thể có nhiều mô-đun hơn nhưng chúng tôi đang giới hạn ở các mô-đun sau.

Chiến lược di cư
Chúng tôi muốn di chuyển hoàn toàn Dagger
sang Hilt
nhưng trong thực tế, chúng tôi cần một cách tiếp cận gia tăng, trong đó trước tiên chúng tôi sẽ di chuyển app
dự án của mình sang Hilt
các mô-đun khác, điều đó có nghĩa là Dagger
và Hilt
sẽ hoạt động song song trong một thời gian cho đến khi quá trình di chuyển hoàn tất.
phiên bản
Câu chuyện này sẽ thực hiện chuyển đổi Dagger 2.24
từ Hilt 2.45
.
Nội dung
- Cấu hình/Chuẩn bị
- Di chuyển Thành phần ứng dụng và Singleton
- Di chuyển lớp ứng dụng
- Di chuyển lớp Hoạt động
- Di chuyển đoạn
- Di chuyển Chế độ xemMô hình
- Dọn dẹp bài di chuyển
- Tóm tắt và Takeaways
Để tích hợp, Hilt
hãy thêm các phụ thuộc sau vào build.gradle
tệp của ứng dụng Gradle
Đồng thời định cấu hình kapt
để đặt đúngErrorType thành true
trong build.gradle
tệp
dependencies {
implementation 'com.google.dagger:hilt-android:2.45'
kapt 'com.google.dagger:hilt-compiler:2.45'
}
// Allow references to generated code
kapt {
correctErrorTypes = true
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android' version '2.45' apply false
}
plugins {
// other plugins
id 'com.google.dagger.hilt.android'
}
android {
....
}
Di chuyển thành phần ứng dụng
Dagger có Singleton
Component
bao gồm tất cả các mô-đun Dagger được tạo trong ứng dụng hoặc các mô-đun khác của dự án và điều đó thường được thực hiện trong AppComponent
lớp được tạo cho Dagger
.
Hãy xem tệp AppComponent.kt hiện tại
Để di chuyển, Singleton
Component
chúng tôi cần cài đặt từng mô-đun, ví dụ: NetworkModule , StorageModule, v.v. vào SingletonComponent
for Hilt
, bạn có thể thực hiện việc này bằng cách chú thích tất cả các mô-đun riêng lẻ đó bằng @InstallIn(SingletonComponent::class)
Nhưng nếu bạn có nhiều mô-đun, việc thay đổi tất cả chúng cùng một lúc sẽ không phải là ý tưởng hay, nhưng bạn có thể tạo một AggregatedModule sẽ được chú thích bằng @InstallIn(SingletonComponent::class)
và bao gồm tất cả Dagger
các mô-đun này được chú thích bằng @Module(includes = [ <all of these modules > ])
.
Chạy project thì báo lỗi
Lỗi DisableModuleHasInstallInCheck
Sau khi bạn chạy, dự án Hilt
sẽ cố gắng tìm @InstallIn
chú thích cho từng mô-đun được bao gồm trong AggregatedModule
chú thích với @Module
. Hilt
sẽ phát sinh lỗi nếu nó tìm thấy một mô-đun không được chú thích @Install
Vì chúng tôi chưa chú thích mọi mô-đun @InstallIn
vì chúng tôi đang ở giữa quá trình di chuyển, chúng tôi có thể tắt lỗi này bằng cách sử dụng cờ sau
-Adagger.hilt.disableModulesHaveInstallInCheck=true
.
bạn có thể chỉ định ở cấp ứng dụng build.gradle
như bên dưới nhưng chúng tôi nên xóa cờ này sau khi hoàn tất quá trình di chuyển.
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
Di chuyển lớp ứng dụng
Để thêm Hilt vào ứng dụng, hãy chú thích Application
lớp bằng @HiltAndroidApp
. Bạn nên loại bỏ @Component
và @Component.Builder
đã có mặt trong AppComponent
lớp như đã đề cập ở trên.
Nếu bạn Application
mở rộng từ DaggerApplication
hoặc triển khai, HasAndroidInjector
bạn vẫn cần giữ một số mã như được hiển thị bên dưới trong cả hai trường hợp này. Điều này là để hỗ trợ cả hai Dagger
và Hilt
song song cho đến khi toàn bộ quá trình di chuyển hoàn tất.
Nếu Application
phần mở rộng của bạn từ DaggerApplication
lớp ứng dụng của bạn sẽ trông như thế này.
Và nếu Application
dụng cụ của bạn HasAndroidInjector
thì ứng dụng của bạn phải trông như thế này
Sau khi toàn bộ quá trình di chuyển hoàn tất, bạn cần xóa mã đó khỏi Application
lớp của mình và Application
di chúc của bạn sẽ giống như bên dưới. (Nhưng đó sẽ là một trong những bước cuối cùng, xin đừng làm điều đó bây giờ)
Chạy dự án, dự án sẽ xây dựng thành công dự án của bạn và Ứng dụng phải khởi chạy mà không có ngoại lệ về thời gian chạy.
Di chuyển lớp hoạt động
Dagger cung cấp @ContributesAndroidInjector
để chỉ định bất kỳ Hoạt động/Đoạn nào làm người đóng góp cho Android Injector, trong dự án của chúng tôi được thực hiện trong MainActivityModule
, một trong các mô-đun được bao gồm trongAggregatedModule
MainActivityModule
trông như thế này trước khi di chuyển
MainActivity
trông như thế này trước khi di chuyển
Để di chuyển MainActivity
sang Hilt
, chúng tôi sẽ loại bỏ hoàn toàn MainActivityModule
lớp mô-đun và thêm chú thích @AndroidEntryPoint
cho MainActivity
. Vì chúng tôi MainActivity
cũng đang mở rộng từ nên DaggerAppCompatActivity
chúng tôi cần mở rộng hoạt động của mình từ tương ứng AppCompatActivity
, vì vậy sau khi di chuyển, chúng tôi MainActivity
sẽ trông giống như bên dưới.
Chạy dự án của bạn, dự án sẽ thành công khi MainActivity
được di chuyển vào Hilt
Di chuyển Fragment/View/BroadcastReceiver
Việc di chuyển bất kỳ Mảnh vỡ nào vào Hilt
sẽ được thực hiện theo các bước tương tự như chúng ta đã thực hiện khi di chuyển MainActivity
sang Hilt. Các bước dưới đây
- Xóa mã nơi bạn đang chú thích Đoạn của mình có
@ContributesAndroidInjector
khả năng là một mô-đun - Xóa Mô-đun
SingletonComponent
đang xử lý@ContributesAndroidInjector
Mảnh vỡ của bạn - Chú thích Fragment của bạn với
@AndroidEntryPoint
- nếu đoạn của bạn được mở rộng từ
DaggerFragment
thì bạn cần mở rộng đoạn của mình khỏiFragment
lớp
Di chuyển Chế độ xemMô hình
Di chuyển ViewModel yêu cầu một số bước.
Đầu tiên chú thích viewModel của bạn với@HiltViewModel
Để được FeatureViewModel
đưa vào, Hilt
chúng tôi sẽ sử dụng tiện ích mở rộng phân đoạn viewModels()
được cung cấp trong phần phụ thuộc tiện ích mở rộng phân đoạn mà chúng tôi sẽ thêm vào build.gradle
tệp tương ứng như bên dưới
implementation "androidx.fragment:fragment-ktx:1.5.6"
Bây giờ Xóa các liên kết @Bind
, @IntoMap
và @ViewModelKey
tương ứng mà FeatureViewModel
chúng tôi đã sử dụng cho Dagger.
Trong dao găm để thêm ViewModel, chúng tôi cũng sẽ có lateinit var
thuộc tính sẽ có injected
trong thời gian chạy bằng cách sử dụng một số thuộc ViewModelFactory
tính cũng không còn cần thiết nữa để Bạn có thể xóa ViewModelModule
và ViewModelProviderFactory
mã liên quan nếu không có ViewModel/Fragment nào khác trên Dagger.
Chạy dự án của bạn, dự án sẽ thành công khi Fragment and ViewModel
được di chuyển vào Hilt
Di chuyển các mô-đun khác.
Cho đến nay, chúng tôi đã di chuyển Components
/ Modules
/ Activity
/ Fragment
trong mô-đun ứng dụng. Nhưng chúng tôi phải di chuyển các mô-đun khác ngay bây giờ, Chúng tôi sẽ chuyển từng mô-đun một và di chuyển hoàn toàn sang Hilt bằng các bước sau
- Thêm
Hilt
phụ thuộc vàobuild.gradle
tệp của mô-đun - Chú thích từng
@Module
với@InstallIn
chú thích. - Xóa
@JvmStatic
chú thích cho mỗi@Provide
chú thích nếu bạn có vì nó không còn cần thiết trongHilt
- Chú thích của bạn
Fragment
/Activity
với@AndroidEntryPoint
và xóa tương ứng@ContributesAndroidInjector
- Di chuyển chú thích ViewModels của bạn bằng
@HiltViewModel
và sử dụng tiện ích mở rộng phân đoạnviewModels()
để thêm các Mô hình xem đó - Tiếp tục xóa tất cả các Mô-đun không cần thiết nữa trong
AggregatedModule
.AggregatedModule
chúng tôi đã tạo ở trên trong bước đầu tiên của mình.
Khi mỗi mô-đun dự án được di chuyển sang Hilt
. Cần thời gian dọn dẹp
- Xóa disableModuleInstallInCheck = true mà chúng tôi đã thêm vào đầu ở cấp ứng dụng hoặc bất kỳ cấp độ nào khác
build.gradle
và xóa@DisableInstallInCheck
chú thích nếu nó được thêm vào bất kỳ@Module
defaultConfig {
//TODO: remove this after migration to Hilt
javaCompileOptions {
annotationProcessorOptions {
arguments["dagger.hilt.disableModulesHaveInstallInCheck"]="true"
}
}
}
4. Xóa tất cả Dagger
các phụ thuộc trong tất cả các mô-đun của bạn.
Chạy dự án của bạn, nó sẽ được chạy thành công, dự án của bạn được di chuyển đầy đủ vào Hilt
Tóm tắt và Takeaways
Tổng quan cấp cao về các thay đổi mã sau khi di chuyển sẽ như thế này
- Tất cả các chú thích mã
@Component
/@Component.Builder
/@Component.Factory
/@ContributesAndroidInjector
/@ViewModelKey
sẽ bị xóa - Tất cả các ViewModels của bạn phải được chú thích bằng
@HiltViewModel
- Tất cả
@Module
các lớp phải được chú thích bằng@InstallIn
chú thích - Các đoạn/Hoạt động/Chế độ xem/Dịch vụ phải được chú thích bằng
@AndroidEntryPoint
- Lớp ứng dụng phải được chú thích với
@HiltAndroidApp
AppComponent
và mã liên quan phải được gỡ bỏ@JvmStatic
chú thích bên trong mô-đun Hilt không được tồn tại nữa
- Dependency Injection sử dụng Hilt
- Di chuyển sang Tài liệu chính thức của Hilt
Hãy nhớ theo dõi và nếu bạn thích nó :)
— — — — — — — — — — —
GitHub | LinkedIn | Twitter
Tăng cấp mã hóa
Cảm ơn vì đã là một phần của cộng đồng của chúng tôi! Trước khi bạn đi:
- Vỗ tay cho truyện và theo dõi tác giả
- Xem thêm nội dung trong ấn phẩm Level Up Coding
- Khóa học phỏng vấn mã hóa miễn phí ⇒ Xem khóa học
- Theo dõi chúng tôi: Twitter | LinkedIn | bản tin