gpt4 book ai didi

android - 注入(inject)实例时将参数传递给提供者方法

转载 作者:行者123 更新时间:2023-11-29 16:50:41 25 4
gpt4 key购买 nike

我是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com