假设我有一班学生@Aject注解。
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批注添加所有必需的依赖项。
@Module
public 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,因此将模块的值传递给Builder本身而不是模块。但是每当我运行此命令时,我都会收到错误消息:@Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
答案 0 :(得分:0)
@ Component.Builder缺少所需模块或组件的设置器:[com.example.javadagger.StudentModule]
这意味着Dagger无法创建StudentModule
(在您的情况下,因为它没有默认构造函数),无法添加它。它说您在创建组件时需要提供模块,而您不需要这样做。
由于要通过构建器直接绑定参数String
和Integer
,并且只使用模块来添加这两种类型,因此解决该问题的方法是删除模块完全。不再需要。
否则,如果出于某种原因要保留具有非默认构造函数的模块,则还可以将所需的方法添加为构建器,例如documentation states:
- ...
- 每个具有非静态绑定方法的非抽象模块必须有一个设置方法,除非Dagger可以使用可见的无参数构造函数实例化该模块 。
- 对于Dagger可以实例化或不需要实例化的模块,可能会有setter方法。