Open geaden opened 4 years ago
I found this 3 years old article by @pyricau where @Inject
is favored over @Provides
. Probably, this should be taken into consideration.
You can safely remove the @Inject, unfortunately Dagger doesn't error out when there are two ways to provide a binding. Creating AboutStyler requires an activity instance, which isnt available in the graph and is passed in as a module param.
You can safely remove the @Inject, unfortunately Dagger doesn't error out when there are two ways to provide a binding. Creating AboutStyler requires an activity instance, which isnt available in the graph and is passed in as a module param.
Great! Thanks for clarification!
I noticed, that
AboutStyler
constructor has@Inject
annotation, however at the same timeAboutStyler
is provided via@Provides
fromAboutActivityModule
with@FeatureScope
. Having looked at generated by Dagger source code,AboutStyler_Factory
is not used anywhere andDaggerAboutComponent
usesAboutActivityModule_ProvideAboutStylerFactory
instead.I removed
@Inject
annotation fromAboutStyler
and run./gradlew :about:assembleDebug --profile
. It seems everything is working,DaggerAboutComponent
remained the same, butAboutStyler_Factory
is not generated. Rough measurement on cleanabout
module on my machine shew, that task:about:kaptDebugKotlin
took 2.686s with@Inject
and 2.299s without.Moreover
AboutActivity
is already bounded inAboutComponent.Builder
, so one can removeprovideContext
andprovideAboutStyler
fromAboutActivityModule
, keeping@Inject
onAboutStyler
. I also added@FeatureScope
toAboutStyler
class. This time generatedAboutStyler_Factory
is used byDaggerAboutComponent
.Diff
```diff --- about/build/generated/source/kapt/debug/io/plaidapp/about/dagger/DaggerAboutComponent.java 2020-05-15 22:03:28.000000000 +0300 +++ about/build/generated/source/kapt/debug/io/plaidapp/about/dagger/DaggerAboutComponent.java 2020-05-15 22:03:34.000000000 +0300 @@ -2,11 +2,13 @@ package io.plaidapp.about.dagger; import dagger.internal.DoubleCheck; +import dagger.internal.InstanceFactory; import dagger.internal.Preconditions; import in.uncod.android.bypass.Markdown; import io.plaidapp.about.ui.AboutActivity; import io.plaidapp.about.ui.AboutActivity_MembersInjector; import io.plaidapp.about.ui.AboutStyler; +import io.plaidapp.about.ui.AboutStyler_Factory; import io.plaidapp.about.ui.model.AboutViewModelFactory; import io.plaidapp.core.dagger.MarkdownModule; import io.plaidapp.core.dagger.MarkdownModule_ProvideMarkdownFactory; @@ -19,14 +21,16 @@ public final class DaggerAboutComponent implements AboutComponent { private final AboutActivityModule aboutActivityModule; - private Provider provideAboutStylerProvider;
+ private Provider activityProvider;
+
+ private Provider aboutStylerProvider;
private Provider provideMarkdownProvider;
private DaggerAboutComponent(AboutActivityModule aboutActivityModuleParam,
- MarkdownModule markdownModuleParam, AboutActivity activity) {
+ MarkdownModule markdownModuleParam, AboutActivity activityParam) {
this.aboutActivityModule = aboutActivityModuleParam;
- initialize(aboutActivityModuleParam, markdownModuleParam, activity);
+ initialize(aboutActivityModuleParam, markdownModuleParam, activityParam);
}
public static AboutComponent.Builder builder() {
@@ -34,12 +38,13 @@
}
private AboutViewModelFactory getAboutViewModelFactory() {
- return new AboutViewModelFactory(provideAboutStylerProvider.get(), AboutActivityModule_ProvideResourcesFactory.provideResources(aboutActivityModule), provideMarkdownProvider.get());}
+ return new AboutViewModelFactory(aboutStylerProvider.get(), AboutActivityModule_ProvideResourcesFactory.provideResources(aboutActivityModule), provideMarkdownProvider.get());}
@SuppressWarnings("unchecked")
private void initialize(final AboutActivityModule aboutActivityModuleParam,
- final MarkdownModule markdownModuleParam, final AboutActivity activity) {
- this.provideAboutStylerProvider = DoubleCheck.provider(AboutActivityModule_ProvideAboutStylerFactory.create(aboutActivityModuleParam));
+ final MarkdownModule markdownModuleParam, final AboutActivity activityParam) {
+ this.activityProvider = InstanceFactory.create(activityParam);
+ this.aboutStylerProvider = DoubleCheck.provider(AboutStyler_Factory.create(activityProvider));
this.provideMarkdownProvider = DoubleCheck.provider(MarkdownModule_ProvideMarkdownFactory.create(markdownModuleParam));
}
```
The question is: is it safe to remove
@Inject
annotation fromAboutStyler
or it's better to removeprovide*
methods fromAboutActivityModule
and keep@Inject
annotation onAboutStyler
constructor? Or we have to keep everything as it is, but we'll have generated unusedAboutStyler_Factory
. This should not be a problem since R8/Proguard will strip such classes, but I suppose it might decrease build time during development, if there are more such cases.I can make all required changes if needed.
Thanks.