I have a component AppComponent
@Component
public interface AppComponent {
}
I have added a Component builder to this, to take external dependencies.
@Component
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder setContext(Context context);
AppComponent build();
}
}
Now, I can build this component in the application class
AppComponent appComponent = DaggerAppComponent.builder()
.setContext(this)
.build();
Everything works perfect.
Now I have another Component, say OtherComponet
@Component
public interface OtherComponent {
}
And I want to add this component as a dependency for AppComponent
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder setContext(Context context);
AppComponent build();
}
}
Now, If I compile, I get the error
error: @Component.Builder is missing setters for required modules or components: [dagger.OtherComponent]
interface Builder {
Make sense. Because I have overridden the default Builder for AppComponent and my custom Component.Builder doesn't have a setter to set the OtherComponent
instance.
So, I add this method to my Custom.Builder
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder setContext(Context context);
@BindsInstance
Builder setOtherComponent(OtherComponent otherComponent);
AppComponent build();
}
}
Now if I compile, I get the exact same error
error: @Component.Builder is missing setters for required modules or components: [dagger.OtherComponent]
What's wrong here? I've already given the setter setOtherComponent
with @BindsInstance
but still why is it saying missing setters for required modules or component
NOTE: if I didn't go for a Custom Component.Builder then dagger will generate builder method for the dependent component
Eg:
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {
}
This would create a builder which can be used like
AppComponent appComponent = DaggerAppComponent.builder()
.otherComponent(otherComponentInstance)
.build();
You don't need to put @BindsInstance
while creating dependent component, it can bind only exposed method inside OtherComponent
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder setContext(Context context);
Builder setOtherComponent(OtherComponent otherComponent);
AppComponent build();
}
}