web-dev-qa-db-fra.com

Dague 2: Injection du paramètre entré par l'utilisateur dans l'objet

Disons que j'ai une classe Util qui prend un objet - une instance de la classe Validator

Puisque je veux éviter d'instancier la classe Validator dans Util, je le passe via un constructeur: 

public class Utils {

   @Inject
   public Util(Validator validator) {

   }


}

J'ai un module qui fournit l'instance Validator:

@Provides
@Singleton
PhoneNumberUtil provideValidator() {
    return Validator.getInstance();
}

et une instance de la classe Util:

@Provides
Util provideUtil(Validator validator) {
    return new Utils(validator);
}

J'ai un composant câblé qui me donnerait un exemple d'Util:

Util getUtil()

alors, dans le cadre de mon activité, je pourrais l'appeler ainsi: 

Util myUtil = getComponent.getUtil();

Tout cela fonctionne bien - myUtil a une instance appropriée de la classe Validator lorsqu'elle est instanciée. 

Maintenant, je veux passer une variable String nommée address (qui est une entrée utilisateur via une interface utilisateur). Je veux changer le constructeur afin que je passe à la fois une instance de Validator et la chaîne entrée par l'utilisateur:

@Inject
public Util(Validator validator, String address) {

}

Je n'arrive pas à comprendre comment passer ce deuxième paramètre. Est ce que quelqu'un peut me dire comment? 

Idéalement, je veux instancier Util comme:

Util myUtil = getComponent.getUtil(txtAddress.getText());
35
Jay Sidri

Vous pouvez modifier le générateur de composant pour injecter des instances. Voir: https://google.github.io/dagger/users-guide#binding-instances

Dans votre cas, vous pouvez appeler:

Util myUtil = DaggerMyComponent.builder().withAddress(txtAddress.getText()).build().getComponent().getUtil();

si MyComponent est défini comme:

@Component(modules = UtilModule.class)
interface MyComponent{

    MyComponent getComponent();

    @Component.Builder
    interface Builder {

        @BindsInstance Builder withAddress(@Address String address); //bind address instance

        MyComponent build();

    }
}

Et UtilModule:

@Module
class UtilModule{

    @Provides
    Util getUtil(Validator validator, @Address String address){ //inject address instance
        return new Util(validator, address);
    }

}

Le validateur doit disposer d'un constructeur annoté @Inject ou d'une méthode annotée @Provides dans une classe de module passée aux modules MyComponent dans l'annotation @Component.

6
teano

quand initier le module, vous pouvez passer certains paramètres comme ceci:

public NetServiceModule(String baseUrl, boolean isLogEnabled, CookieJar cookieJar) {
    this.mBaseUrl = baseUrl;
    this.mIsLogEnabled = isLogEnabled;
    this.mCookieJar = cookieJar;
}

Et puis récupérez le composant dans "Container Class":

NetServiceComponent component = DaggerNetServiceComponent.builder()
            .netServiceModule(new NetServiceModule(baseUrl, mIsLogEnabled, cookieJar))
            .build();
    component.inject(this);

Avec Fournit méthode pour fournir Injection qui génère par certains paramètres s’il a besoin de:

@Provides
Retrofit provideRetrofit(OkHttpClient httpClient, GsonConverterFactory gsonConverterFactory, NetCallAdapterFactory netCallAdapterFactory) {

    return new Retrofit.Builder()
            .client(httpClient)
            .baseUrl(mBaseUrl)
            .addConverterFactory(gsonConverterFactory)
            .addCallAdapterFactory(netCallAdapterFactory)
            .build();
}
2
Francis Shi
@Inject
Usermodel uuser;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    userComponent dc = DaggeruserComponent.create();
    dc.injectMain(this);

    historymodel hm =  uuser.getHistorymodel();// get the models to pass user inputs 

    videoModel vm = uuser.getVideoModel();//  get the models to pass user inputs

    hm.setUid("userid ");


}

}

0
Koushik Deb