为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Dagger 重写 Component 的 Builder 接口

如何使用 Dagger 重写 Component 的 Builder 接口

慕少森 2023-08-04 15:41:41
假设我有一个带有 @Inject 注释的 Student 类。public class Student {    private String name;    private Integer age;    @Inject    public Student(String name, Integer age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}然后我有一个模块,在其中使用 @Provides 注释添加所有必需的依赖项。@Modulepublic class StudentModule {    private String name;    private Integer age;    public StudentModule(String name, Integer age) {        this.name = name;        this.age = age;    }    @Provides    String provideName() {        return name;    }    @Provides    Integer provideAge() {        return age;    }}当然我还有 StudentComponent。@Component(modules = {StudentModule.class})public interface StudentComponent {    Student getStudent();    @Component.Builder    interface Builder {        @BindsInstance        Builder studentName(String studentName);        @BindsInstance        Builder studentAge(Integer studentAge);        StudentComponent build();    }}我想重写 Builder,以便将值传递给构建器本身,而不是模块。但每当我运行这个时,我都会收到错误:@Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

@Component.Builder 缺少所需模块或组件的设置器:[com.example.javadagger.StudentModule]

这意味着 Dagger 无法创建StudentModule(在您的情况下,因为它没有默认构造函数)并且无法添加它。它说您需要在创建组件时提供模块,但您没有这样做。

由于您希望直接通过构建器绑定参数,并且您仅使用该模块来添加相同的两种类型,因此问题的解决方案是完全删除该模块StringInteger不再需要了。

否则,如果由于某种原因您想要保留具有非默认构造函数的模块,您还可以将所需的方法添加到构建器,如文档所述:

  • ...

  • 每个具有非静态绑定方法的非抽象模块都必须有一个 setter 方法除非 Dagger 可以使用可见的无参数构造函数实例化该模块

  • Dagger 可以实例化或不需要实例化的模块可能有 setter 方法。


查看完整回答
反对 回复 2023-08-04
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信