Hilt DI lain?

Perkenalkan Hilt - Dependency Injection (DI) di JetPack, tetapi itu tidak benar karena Hilt hanyalah pembungkus di sekitar Dagger2. Untuk proyek kecil, ini akan dapat berdiri sebagai alat yang lebih nyaman dan terintegrasi dengan baik dengan produk lainnya di JetPack.



Saya tidak akan menjelaskan cara menambahkan proyek, semuanya dijelaskan dengan baik di artikel



Untuk apa?



Dagger2 adalah DI yang agak rumit, Anda dapat dengan mudah bingung apa dan di mana Anda meletakkannya. Muncul dengan jumlah komponen yang tak terbatas dan meningkatkan jumlah abstraksi. Dan semakin besar proyeknya, semakin banyak kebingungan.



Dan jika Anda ingin menggunakan Dagger2, tetapi dengan sedikit usaha, maka Hilt diciptakan untuk ini.



Apa yang disederhanakan untuk kami:



  • Komponen siap pakai (dari namanya sudah jelas apa yang mereka maksud)

    • ApplicationComponent
    • ActivityRetainedComponent
    • ActivityComponent
    • FragmentComponent
    • ViewComponent
    • ViewWithFragmentComponent
    • ServiceComponent
  • Dalam modul Anda menentukan komponen mana yang akan ditambahkan
  • Melalui @AndroidEntryPoint Hilt, compiler menghasilkan seluruh bolierplate untuk pembuatan dan penyimpanan komponen (misalnya, ActivityRetainedComponent akan menyimpan entitas setelah rotasi layar, ActivityComponent akan membuat ulang).


Kode ini terlihat cukup elegan (seluruh boilerplate akan dibuatkan untuk kita)



@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() { 
    @Inject lateinit var testService: TestService
}


Fitur:



Aplikasi diperlukan



Anda perlu mendeklarasikan Aplikasi dan menandai @HiltAndroidApp, tanpanya Hilt tidak akan berfungsi.



@HiltAndroidApp
class App : Application() { }


Ketergantungan hirarkis



Hilt , Activity @AndroidEntryPoint



View @WithFragmentBindings Fragment @AndroidEntryPoint, Activity Fragment





Dagger2, , @InstallIn. , .



@InstallIn(ApplicationComponent::class)
@Module
class NetworkModule {
    @Singleton
    @Provides
    fun provideHttpService(): HttpService {
        return object : HttpService {
            init {
                Log.e("Tester", "HttpService initialized")
            }
            override fun request() {
                Log.e("Tester", "HttpService::request")
            }
        }
    }
}


Hilt, @InstallIn, , .



Component Subcomponent



, Dagger2, Hilt . :



DaggerLoginComponent.builder()
        .context(this)
        .appDependencies(
          EntryPointsAccessors.fromApplication(
            applicationContext,
            LoginModuleDependencies::class.java
          )
        )
        .build()
        .inject(this)




, . ( ), Dagger2.



@AndroidEntryPoint



  • Activity ComponentActivity AppCompatActivity
  • Fragment androidx.Fragment
  • Retain




Hilt :



  • Dagger Component-
  • Application, Activity, Fragment, View ., @AndroidEntryPoint
  • Dagger


ActivityRetainedComponent



ViewModel arch :



this.viewModelProvider =
        new ViewModelProvider(
            activity,
            new ViewModelProvider.Factory() {
              @NonNull
              @Override
              @SuppressWarnings("unchecked")
              public <T extends ViewModel> T create(@NonNull Class<T> aClass) {
                ActivityRetainedComponent component =
                    ((GeneratedComponentManager<LifecycleComponentBuilderEntryPoint>)
                            activity.getApplication())
                        .generatedComponent()
                        .retainedComponentBuilder()
                        .build();
                return (T) new ActivityRetainedComponentViewModel(component);
              }
            });




:



  • Dagger2
  • ( )
  • boilerpate .
  • Dagger2 ( , ..)


:



  • , , Dagger2
  • ,
  • Dagger2
  • , , Fragment Activity c @AndroidEntryPoint


:






All Articles