【问题标题】:How to pass parameters in dagger2?如何在dagger2中传递参数?
【发布时间】:2026-01-03 06:15:02
【问题描述】:

如下:

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);

}

上面的代码,只创建了三个同名的用户对象,但我想用不同的名称创建

我尝试使用'@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");
}

但是“providesUser”方法已经定义好了。

名称参数是最终的,不能修改

这种情况应该怎么处理!!!

【问题讨论】:

  • 你想要的是一个UserFactory,它可以接受一个参数name并返回一个完全注入的User实例,其中name与注入的依赖项一起提供。这个概念在 Guice 中称为“辅助注射”;我标记为这个问题的重复:Can I use some kind of assisted Inject with Dagger?
  • 我不明白。意思是使用新库'Guice'?避免使用这种方式?
  • Guice 是一个较旧的依赖注入框架,它(在某种程度上)与 Dagger 相关。使用 Guice 的人都知道“辅助注射”一词,但如果您从 Dagger 开始,可能会不清楚。无论如何,您问的问题与我链接的问题相同。

标签: dagger


【解决方案1】:

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

@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");
}

【讨论】:

    【解决方案2】:

    如果你想要一个动态名称关联,不要使用@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());
    }
    

    【讨论】: