如何在dagger2中传递参数?

时间:2017-03-01 07:38:00

标签: dagger

如下所示:

public class MainActivity extends Activity {
@Inject
User mUser1;
@Inject
User mUser2;
@Inject
User mUser3;

protected void onCreate(@Nullable Bundle savedInstanceState) {
    // how to inject ...
    ......
    Log.d("XXX",mUser1.getName());
    Log.d("XXX",mUser2.getName());
    Log.d("XXX",mUser3.getName());
}

}

public class User {
private final String name;
public User (String name) {
    this.name = name;
}
public String getName() {
    return name;
}

}

@Module
public class MainModule {
@Provides
User providesUser(String name) {
     return new User(name);
}
@Provides
String providesUser() {
     return "Jack";
}

}

@Component(modules = MainModule .class)
public interface ChildComponent {
void inject(MainActivity activity);

}

在代码上方,只创建三个具有相同名称的用户对象,但我想用diff名称

创建

我尝试使用' @ Qualifier',但它只区分构造函数,无法传输名称参数

我在MainModule.java中尝试这个:

@Named("Yuri")
@Provides
User providesUser() {
     return new User("yuri");
}

@Named("Warren")
@Provides
User providesUser() {
     return new User("warren");
}

@Named("Jack")
@Provides
User providesUser() {
     return new User("Jack");
}

但方法'提供用户'已定义。

名称参数是最终的,无法修改

如何处理这种情况!!!

2 个答案:

答案 0 :(得分:0)

方法名称无关紧要。只有返回类型才是最重要的。所以:

@Named("Yuri")
@Provides
User providesUserYuri() {
     return new User("yuri");
}

@Named("Warren")
@Provides
User providesUserWarren() {
     return new User("warren");
}

@Named("Jack")
@Provides
User providesUserJack() {
     return new User("Jack");
}

答案 1 :(得分:0)

如果您想要动态名称关联,请不要使用@Qualifier,这些仅用于@Providers参数的差异化。 只需使用Java POJO对象 现在User类就像这样:

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
       this.name = name;
    }
}

现在在Activity你可以这样说:

@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    user1.setName("Ali");
    user2.setName("Hossein");
    user3.setName("Reza");

    Log.d(TAG, user1.getName());
    Log.d(TAG, user2.getName());
    Log.d(TAG, user3.getName());
}