Search code examples
androiddependency-injectiondagger-2dagger

Dagger 2 throws error for Component.Builder : @Component.Builder is missing setters for required modules or components:


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();

Solution

  • 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();
        }
    }