如何使用 Dagger 覆盖 Component 的 Builder 接口
How to override Component's Builder interface using Dagger
假设我有一个 class 学生用 @Inject 注释进行注释。
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();
}
}
我想重写生成器,而不是模块将值传递给生成器本身。但是每当我 运行 这个我得到错误: @Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
@Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
这意味着 Dagger 无法创建 StudentModule
(在您的情况下,因为它没有默认构造函数)并且无法添加它。它说你需要在创建组件时提供模块——你没有这样做。
由于您想通过构建器直接绑定参数 String
和 Integer
——并且您仅使用该模块来添加相同的两种类型——您的问题的解决方案是删除模块完全。不需要了。
否则,如果出于某种原因你想保留一个带有非默认构造函数的模块,你也可以将所需的方法添加到构建器中,如 documentation states:
- ...
- There must be a setter method for each non-abstract module that has non-static binding methods, unless Dagger can instantiate that module with a visible no-argument constructor.
- There may be setter methods for modules that Dagger can instantiate or does not need to instantiate.
假设我有一个 class 学生用 @Inject 注释进行注释。
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();
}
}
我想重写生成器,而不是模块将值传递给生成器本身。但是每当我 运行 这个我得到错误: @Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
@Component.Builder is missing setters for required modules or components: [com.example.javadagger.StudentModule]
这意味着 Dagger 无法创建 StudentModule
(在您的情况下,因为它没有默认构造函数)并且无法添加它。它说你需要在创建组件时提供模块——你没有这样做。
由于您想通过构建器直接绑定参数 String
和 Integer
——并且您仅使用该模块来添加相同的两种类型——您的问题的解决方案是删除模块完全。不需要了。
否则,如果出于某种原因你想保留一个带有非默认构造函数的模块,你也可以将所需的方法添加到构建器中,如 documentation states:
- ...
- There must be a setter method for each non-abstract module that has non-static binding methods, unless Dagger can instantiate that module with a visible no-argument constructor.
- There may be setter methods for modules that Dagger can instantiate or does not need to instantiate.