Di chuyển từ Dagger2 sang Hilt trong dự án đa mô-đun

May 10 2023
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.

Hướng dẫn từng bước để di chuyển từ Daggersang Hilttrong một dự án đa mô-đun.

Ảnh của Saif71.com trên Bapt

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à DaggerHiltsẽ 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ỏ @Component@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 DaggerHiltsong 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

  1. 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
  2. Xóa Mô-đun SingletonComponentđang xử lý @ContributesAndroidInjectorMảnh vỡ của bạn
  3. Chú thích Fragment của bạn với@AndroidEntryPoint
  4. 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ỏi Fragmentlớ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, @IntoMap@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 ViewModelModuleViewModelProviderFactorymã 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

  1. Thêm Hiltphụ thuộc vào build.gradletệp của mô-đun
  2. Chú thích từng @Modulevới @InstallInchú thích.
  3. 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
  4. Chú thích của bạn Fragment/ Activityvới @AndroidEntryPointvà xóa tương ứng@ContributesAndroidInjector
  5. 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ạn viewModels()để thêm các Mô hình xem đó
  6. 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

  1. 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
  2. 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

  1. Tất cả các chú thích mã @Component/ @Component.Builder/ @Component.Factory/ @ContributesAndroidInjector/ @ViewModelKeysẽ bị xóa
  2. Tất cả các ViewModels của bạn phải được chú thích bằng@HiltViewModel
  3. Tất cả @Modulecác lớp phải được chú thích bằng @InstallInchú thích
  4. Các đoạn/Hoạt động/Chế độ xem/Dịch vụ phải được chú thích bằng@AndroidEntryPoint
  5. Lớp ứng dụng phải được chú thích với@HiltAndroidApp
  6. AppComponentvà mã liên quan phải được gỡ bỏ
  7. @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