0

Like the following:

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

}

Above the code, only create three user object with same name, but i want to created with diff name

I try to use '@Qualifier', but it only distinguish constructor, can't transfer the name parameter

I try this in 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");
}

But the method 'providesUser' is already defined.

Name parameter is final, can't modify

How should this situation be handled!!!

Yuri.Zheng
  • 11
  • 2
  • What you want is a `UserFactory`, which can take a single parameter `name` and returns a fully-injected `User` instance with that `name` provided alongside the injected dependencies. That concept is called "assisted injection" in Guice; I'm marking as a duplicate of this question: [Can I use some kind of assisted Inject with Dagger?](http://stackoverflow.com/questions/29175014/can-i-use-some-kind-of-assisted-inject-with-dagger) – Jeff Bowman Mar 01 '17 at 19:58
  • I do not understand. Mean use new library 'Guice'? Avoid using this way? – Yuri.Zheng Mar 04 '17 at 02:29
  • Guice is an older dependency injection framework that is (somewhat) related to Dagger. The term "assisted injection" is known to people who use Guice, but may not be clear if you started with Dagger. In any case, you are asking the same question as that one I linked. – Jeff Bowman Mar 04 '17 at 09:37

2 Answers2

0

Method name doesn't matter. Only return type is what matters. So:

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

If you want a dynamic name association, don't use @Qualifier, these are just for make differential of @Providers parameters. Simply use Java POJO objects.
Now the User class would be like this:

public class User {

    private String name;

    public String getName() {
        return name;
    }

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

Now in your Activity you can say this:

@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());
}
matio
  • 397
  • 2
  • 14