我是Dagger 2中的新手。我创建了一个模块,它有一个带有一个String参数的提供者方法:
@Module
public class MyModule {
@Provides
Student provideStudent(String name) {
return new Student(name);
}
}
注入学生时如何传递参数name
? @Inject Student student
?但是我在哪里/如何通过name
?
答案 0 :(得分:2)
您希望提供一个对象(String name
)作为组件的参数,以便其他部分可以使用它。你基本上有2个选项可以这样做。
使用模块参数是" classic"在介绍Component.Builder
之前使用的方法。
您所做的只是将您需要的内容添加到模块构造函数中,并从模块中提供它。
@Module
public class MyModule {
private String name;
MyModule(String name) {
this.name = name;
}
// -----------------------------------------------
// you could obviously just use the field directly
@Provides
Student provideStudent() {
return new Student(name);
}
// ---------------------------------------------------------------------
// alternatively you'd add a Qualifier and add the argument to the graph
@Provides
@Named("name")
String provideName() {
return name;
}
// then you can use it...
@Provides
Student provideStudent(@Named("name") String name) {
return new Student(name);
}
}
直接使用该名称的第一个选项意味着它仅在 模块中可用。如果你想使用构造函数注入或使用限定的String,你必须将它添加到图形中,如图所示。
无论采用哪种方法,您都必须手动将模块添加到组件中,因为模块不再使用默认构造函数。这也是你现在提供论据的地方。
DaggerMyComponent.builder()
.myModule(new MyModule("some name"))
.build();
相同的概念,但不同的方法是使用组件构建器来实现相同的东西 - 将某些东西绑定到图形。
@Component(modules = MyModule.class)
interface MyComponent {
@Component.Builder
interface Builder {
@BindsInstance Builder name(@Named("name") String name);
MyComponent build();
}
}
@Module
class MyModule {
@Provides
Student provideStudent(@Named("name") String name) {
return new Student(name);
}
}
在这里,您还可以向图表中添加一个可以使用的对象。在这里,您也必须将其添加到组件构建器
DaggerMyComponent.builder()
.name("some name")
.build();
答案 1 :(得分:1)
我的问题是如何注入一个名字的学生实例 硬编码。
name
是Student
的依赖项,此依赖关系将被解决。为此,您需要一个带注释的@Provid
e方法,该方法返回String
。由于类型通常由返回类型推断,因此在String
的情况下,您还必须使用注释@Named
@Provides
@Named("Name")
public String provideName() {
return "My name";
}
并改变你的方法,如
@Provides
Student provideStudent(@Named("Name") String name) {
return new Student(name);
}
这样dagger2知道如何解决String
以构建Student
答案 2 :(得分:1)
您可以创建"2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-07-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC", "2020-06-01 UTC"
工厂并注入它,而不是直接注入Student
:
Student
或Kotlin中的相同代码:
public class Student {
public Student(String name, Knowledge knowledge) {
}
public static class Factory {
private Knowledge knowledge;
@Inject
public Factory(Knowledge knowledge) {
this.knowledge = knownledge;
}
public Student create(String name) {
return new Student(name, knowledge);
}
}
}
这允许在class Student(name: String, knowledge: Knowledge) {
class Factory @Inject constructor(private val knowledge: Knowledge) {
fun create(name: String) = Student(name, knowledge)
}
}
实例上传递name
参数,如下所示:
Student