我是 Dagger 2 的新手。我创建了一个模块,它有一个带有一个字符串参数的提供者方法:
@Module
public class MyModule {
@Provides
Student provideStudent(String name) {
return new Student(name);
}
}
注入(inject)student时如何传递参数name
? @Inject Student 学生
?但是我在哪里/如何传递 name
呢?
最佳答案
您想提供一个对象(字符串名称
)作为组件的参数,以便其他部分可以使用它。您基本上有 2 个选择。
模块构造函数参数
使用模块参数是您在引入 Component.Builder
之前使用的“经典”方法。
您所做的就是将您需要的内容添加到您的模块构造函数中,并从模 block 中提供它。
@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);
}
}
第一个直接使用名称的选项意味着它仅在那个 模块中可用。如果您想使用构造函数注入(inject)或使用限定字符串,您必须将其添加到图中,如第二个所示。
无论使用哪种方法,您都必须手动将模块添加到组件,因为模块不再使用默认构造函数。这也是您现在提供论点的地方。
DaggerMyComponent.builder()
.myModule(new MyModule("some name"))
.build();
组件生成器
相同的概念但不同的方法是使用组件构建器来实现相同的事情——将某些东西绑定(bind)到图形。
@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();
关于android - 注入(inject)实例时将参数传递给提供者方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46523145/