Rencontrez Hilt - Dependency Injection (DI) dans JetPack, mais ce n'est pas vrai car Hilt n'est qu'un wrapper autour de Dagger2. Pour les petits projets, il sera en mesure de se présenter comme un outil plus pratique et s'intégrera bien avec le reste des produits de JetPack.
Je ne décrirai pas comment ajouter au projet, tout est bien décrit dans l' article
Pourquoi?
Dagger2 est une DI assez complexe, vous pouvez facilement vous demander quoi et où vous le mettez. Venir avec un nombre infini de composants et augmenter le nombre d'abstractions. Et plus le projet est grand, plus la confusion augmente.
Et si vous souhaitez utiliser Dagger2, mais avec un minimum d'effort, Hilt a été inventé pour cela.
Ce qui a été simplifié pour nous:
- Composants prêts à l'emploi (à partir des noms, il est clair à quoi ils se réfèrent)
- ApplicationComponent
- ActivitéRétenuComposant
- ActivitéComposant
- FragmentComposant
- ViewComponent
- ViewWithFragmentComponent
- ServiceComponent
- Dans le module, vous spécifiez quel composant ajouter
- Grâce à @AndroidEntryPoint Hilt, le compilateur génère l'intégralité du bolierplate pour la création et le stockage des composants (par exemple, ActivityRetainedComponent enregistrera l'entité après la rotation de l'écran, ActivityComponent recréera).
Ce code a l'air assez élégant (l'ensemble du passe-partout sera généré pour nous)
@AndroidEntryPoint
class ExampleActivity : AppCompatActivity() {
@Inject lateinit var testService: TestService
}
Traits:
Une demande est requise
Vous devez déclarer Application et marquer @HiltAndroidApp, sans cela, Hilt ne fonctionnera pas.
@HiltAndroidApp
class App : Application() { }
Dépendance hiérarchique
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/