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

问题描述 投票:0回答:1

我有一个成分AppComponent

@Component
public interface AppComponent {

}

我为此添加了一个组件构建器,以获取外部依赖关系。

@Component
public interface AppComponent {

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

        AppComponent build();
    }
}

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

    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没有用于设置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]

这里怎么了?我已经给二传手setOtherComponent@BindsInstance了,但是为什么它会说missing setters for required modules or component

注意:如果我不打算使用Custom Component.Builder,那么匕首将为依赖组件生成builder方法

例如:

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

这将创建一个可以像]一样使用的构建器>

 AppComponent appComponent = DaggerAppComponent.builder()
                            .otherComponent(otherComponentInstance)
                            .build();

我有一个组件AppComponent @Component公共接口AppComponent {}我为此添加了一个组件构建器,以获取外部依赖关系。 @Component公共接口AppComponent {...

android dependency-injection dagger-2 dagger
1个回答
0
投票

[创建依赖项组件时无需放置@BindsInstance,它只能在OtherComponent内部绑定暴露方法

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

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

        Builder setOtherComponent(OtherComponent otherComponent);

        AppComponent build();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.