您希望将一个对象 (String name) 作为参数提供给您的组件,以便其他部分可以使用它。你基本上有两种选择。
模块构造函数参数
使用模块参数是您在引入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);
}
}
直接使用名称的第一个选项意味着它仅在 that 模块中可用。如果要使用构造函数注入或使用限定字符串,则必须将其添加到图中,如第二个所示。
使用任何一种方法,您都必须手动将模块添加到组件中,因为模块不再使用默认构造函数。这也是你现在提供论点的地方。
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();