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ừ Daggersang Hilttrong 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 Daggersang Hiltnhư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 appdự án của mình sang Hiltcác mô-đun khác, điều đó có nghĩa là Daggervà Hiltsẽ 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.24từ 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, Hilthãy thêm các phụ thuộc sau vào build.gradletệp của ứng dụng Gradle
Đồng thời định cấu hình kaptđể đặt đúngErrorType thành truetrong build.gradletệ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 Componentbao 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 AppComponentlớp được tạo cho Dagger.
Hãy xem tệp AppComponent.kt hiện tại
Để di chuyển, Singleton Componentchúng tôi cần cài đặt từng mô-đun, ví dụ: NetworkModule , StorageModule, v.v. vào SingletonComponentfor 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ả Daggercá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 Hiltsẽ cố gắng tìm @InstallInchú thích cho từng mô-đun được bao gồm trong AggregatedModulechú thích với @Module. Hiltsẽ phát sinh lỗi nếu nó tìm thấy một mô-đun không được chú thích @InstallVì chúng tôi chưa chú thích mọi mô-đun @InstallInvì 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.gradlenhư 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 Applicationlớp bằng @HiltAndroidApp. Bạn nên loại bỏ @Componentvà @Component.Builderđã có mặt trong AppComponentlớp như đã đề cập ở trên.
Nếu bạn Applicationmở rộng từ DaggerApplicationhoặc triển khai, HasAndroidInjectorbạ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 Daggervà Hiltsong song cho đến khi toàn bộ quá trình di chuyển hoàn tất.
Nếu Applicationphần mở rộng của bạn từ DaggerApplicationlớp ứng dụng của bạn sẽ trông như thế này.
Và nếu Applicationdụng cụ của bạn HasAndroidInjectorthì ứ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 Applicationlớp của mình và Applicationdi 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
MainActivityModuletrông như thế này trước khi di chuyển
MainActivitytrông như thế này trước khi di chuyển
Để di chuyển MainActivitysang Hilt, chúng tôi sẽ loại bỏ hoàn toàn MainActivityModulelớp mô-đun và thêm chú thích @AndroidEntryPointcho MainActivity. Vì chúng tôi MainActivitycũng đang mở rộng từ nên DaggerAppCompatActivitychú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 MainActivitysẽ 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 Hiltsẽ đượ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 MainActivitysang 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ó
@ContributesAndroidInjectorkhả năng là một mô-đun - Xóa Mô-đun
SingletonComponentđang xử lý@ContributesAndroidInjectorMả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ừ
DaggerFragmentthì bạn cần mở rộng đoạn của mình khỏiFragmentlớ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, Hiltchú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.gradletệ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, @IntoMapvà @ViewModelKeytương ứng mà FeatureViewModelchúng tôi đã sử dụng cho Dagger.
Trong dao găm để thêm ViewModel, chúng tôi cũng sẽ có lateinit varthuộc tính sẽ có injectedtrong thời gian chạy bằng cách sử dụng một số thuộc ViewModelFactorytính cũng không còn cần thiết nữa để Bạn có thể xóa ViewModelModulevà ViewModelProviderFactorymã 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/ Fragmenttrong 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
Hiltphụ thuộc vàobuild.gradletệp của mô-đun - Chú thích từng
@Modulevới@InstallInchú thích. - Xóa
@JvmStaticchú thích cho mỗi@Providechú 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/Activityvới@AndroidEntryPointvà xóa tương ứng@ContributesAndroidInjector - Di chuyển chú thích ViewModels của bạn bằng
@HiltViewModelvà 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.AggregatedModulechú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.gradlevà xóa@DisableInstallInCheckchú 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ả Daggercá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/@ViewModelKeysẽ 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ả
@Modulecác lớp phải được chú thích bằng@InstallInchú 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 AppComponentvà mã liên quan phải được gỡ bỏ@JvmStaticchú 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

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































