3 votes

Transmettre des données du dépôt au ViewModel

J'ai besoin de passer la variable de taux de change de mon dépôt au viewmodel. Dans viewmodel, j'ai une méthode calculateRate, là après avoir cliqué sur le bouton, j'obtiens les devises à la question rétrofit et ensuite rétrofit récupère les données du web. Dans la variable de taux de change, j'ai l'échange de deux devises et je dois la passer au viewmodel. Comment faire ?

Dépôt

public class CurrencyRepository {

private ApiInterface apiInterface;
private String apiKey = ApiClient.KEY;
private String TAG = "REPOSITORY ";

public CurrencyRepository(Application application) {
   apiInterface = ApiClient.getClient();
}

public LiveData getCurrency(String base, final String target, String apiKey) {

    final MutableLiveData data = new MutableLiveData<>();
    apiInterface.getCurrentCurrency(base, target, apiKey).enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            data.setValue(response.body());

            String get = data.getValue().getTarget();
            double rate = 0;
            DecimalFormat df = new DecimalFormat("0.00"); //#
            switch (get) {
                case "EUR":
                    rate = data.getValue().getRates().getEUR();
                    break;
                case "PLN":
                    rate = data.getValue().getRates().getPLN();
                    break;
                case "USD":
                    rate = data.getValue().getRates().getUSD();
                    break;
                case "CHF":
                    rate = data.getValue().getRates().getCHF();
                    break;
            }
            Log.d(TAG, String.valueOf(df.format(rate)));
        }

        @Override
        public void onFailure(Call call, Throwable t) {

        }
    });
    return data;
}

}

Viewmodel

public class MainViewModel extends AndroidViewModel {

private CurrencyRepository currencyRepository;
public final ObservableField from = new ObservableField<>();
public final ObservableField to = new ObservableField<>();
public final ObservableFloat value = new ObservableFloat();
public final ObservableField result = new ObservableField<>();

public MainViewModel(Application application) {
   super(application);
   currencyRepository = new CurrencyRepository(application);
}

public void calculateRate() {
    currencyRepository.getCurrency(String.valueOf(from.get()), String.valueOf(to.get()), ApiClient.KEY);
}

}

3voto

Akram Shokri Points 11

Vous pouvez le faire de cette manière :

Définissez rate comme un champ LiveData au lieu d'une variable locale :

public class CurrencyRepository {

    private ApiInterface apiInterface;
    private String apiKey = ApiClient.KEY;
    private String TAG = "REPOSITORY ";
    private MutableLiveData rate = new MutableLiveData(); //ou l'initialiser dans le constructeur 
    ....

Ensuite, dans votre méthode d'appel de service, vous devez faire ceci :

public MutableLiveData getCurrency(String base, final String target, String apiKey) {

final MutableLiveData data = new MutableLiveData<>();
apiInterface.getCurrentCurrency(base, target, apiKey).enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        data.setValue(response.body());

        String get = data.getValue().getTarget();

        DecimalFormat df = new DecimalFormat("0.00"); //#
        switch (get) {
            case "EUR":
                rate.postValue(data.getValue().getRates().getEUR());
                break;
            case "PLN":
                rate.postValue(data.getValue().getRates().getPLN());
                break;
            case "USD":
                rate.postValue(data.getValue().getRates().getUSD());
                break;
            case "CHF":
                rate.postValue(data.getValue().getRates().getCHF());
                break;
        }
        Log.d(TAG, String.valueOf(df.format(rate)));
    }

    @Override
    public void onFailure(Call call, Throwable t) {

    }
  });
  return data;
}

Ajoutez un getter pour rate dans votre repository :

public LiveData getRate() {
    return rate;
}

Et dans votre ViewModel, vous avez besoin d'une méthode pour obtenir rate depuis le repository :

public class MainViewModel extends ViewModel {
    ...

    public LiveData getRate(){
         return currencyRepository.getRate();
    }
}

Et voilà !

Vous pouvez maintenant observer la méthode getRate() de votre ViewModel et réagir en fonction de sa valeur dans la méthode onChange() de votre Observer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X