【问题标题】:Dagger 2 throws error for Component.Builder : @Component.Builder is missing setters for required modules or components:Dagger 2 为 Component.Builder 引发错误:@Component.Builder 缺少所需模块或组件的设置器:
【发布时间】:2020-09-02 02:59:09
【问题描述】:

我有一个组件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 的默认 Builder 并且我的自定义 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]

这里有什么问题?我已经给了 setter setOtherComponent@BindsInstance 但是为什么它说 missing setters for required modules or component

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

例如:

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

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

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

【问题讨论】:

  • 添加 setOtherComponenet 时是否尝试删除 bindInstance?

标签: android dependency-injection dagger-2 dagger


【解决方案1】:

创建依赖组件时不需要放@BindsInstance,它只能绑定OtherComponent内部暴露的方法

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

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

        Builder setOtherComponent(OtherComponent otherComponent);

        AppComponent build();
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2018-02-22
    • 1970-01-01
    • 2018-01-03
    • 2016-10-21
    • 1970-01-01
    相关资源
    最近更新 更多