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)
@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
:
- https://developer.android.com/training/dependency-injection/hilt-android
- https://developer.android.com/training/dependency-injection/hilt-multi-module
- https://medium.com/androiddevelopers/dependency-injection-on-android-with-hilt-67b6031e62d
- https://codelabs.developers.google.com/codelabs/android-dagger-to-hilt/