Dagger 2 为 Component.Builder 抛出错误:@Component.Builder 缺少所需模块或组件的设置器:

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

我有一个组件AppComponent

@Component
public interface AppComponent {

}

我已经为此添加了一个组件生成器,以获取外部依赖项。

@Component
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder setContext(Context context);

        AppComponent build();
    }
}

现在,我可以在应用程序中构建此组件 class

    AppComponent appComponent = DaggerAppComponent.builder()
                                        .setContext(this)
                                        .build();

一切正常。

现在我有另一个组件,说 OtherComponet

@Component
public interface OtherComponent {
}

我想将此组件添加为 AppComponent

的依赖项
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder setContext(Context context);

        AppComponent build();
    }
}

现在,如果我编译,我得到错误

error: @Component.Builder is missing setters for required modules or components: [dagger.OtherComponent]
    interface Builder {

有道理。因为我已经覆盖了 AppComponent 的默认构建器,而我的自定义 Component.Builder 没有 setter 来设置 OtherComponent 实例。

所以,我将此方法添加到我的 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();
    }
}

现在如果我编译,我会得到完全相同的错误

error: @Component.Builder is missing setters for required modules or components: [dagger.OtherComponent]

这是怎么回事?我已经用 @BindsInstance 给出了 setter setOtherComponent 但为什么它仍然说 missing setters for required modules or component

注意:如果我没有选择自定义 Component.Builder,那么 Dagger 将为依赖组件生成生成器方法

例如:

@Component(dependencies = {OtherComponent.class})
public interface AppComponent {
}

这将创建一个可以像

一样使用的构建器
 AppComponent appComponent = DaggerAppComponent.builder()
                            .otherComponent(otherComponentInstance)
                            .build();

创建依赖组件时不需要放@BindsInstance,只绑定暴露在OtherComponent

中的方法
@Component(dependencies = {OtherComponent.class})
public interface AppComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder setContext(Context context);

        Builder setOtherComponent(OtherComponent otherComponent);

        AppComponent build();
    }
}