Наблюдайте (и обрабатывайте) LiveData внутри моей ViewModel.И только потом передать, если просматривать, разделив на меньшие объекты LaveData - PullRequest
0 голосов
/ 30 января 2019

Я хочу:

  1. Получить данные для моей ViewModel.

  2. Разделить их на объекты LiveData.

  3. Сделайте что-нибудь с этим, и только потом передайте это на мой взгляд.

Некоторые параметры пользователя зависят друг от друга.Например, изменение mGender должно измениться mAge Итак, вот что я сделал

DAO

@Query("SELECT * FROM users WHERE _id = :id")
LiveData<User> getUserById(int id);

ViewModel

private MediatorLiveData<Integer> mUnitSystem = new MediatorLiveData<>();
private MediatorLiveData<Integer> mAge = new MediatorLiveData<>();
private MediatorLiveData<Integer> mGender = new MediatorLiveData<>();
private MediatorLiveData<Double> mHeight = new MediatorLiveData<>();

public UserSettingsViewModel(@NonNull Application application) {
    super(application);
    mData = Injector.getDataReporitory(application);
    MediatorLiveData<User> userMediatorLiveData = new MediatorLiveData<>();
    userMediatorLiveData.addSource(mData.getUser(1), new Observer<User>() {
        @Override
        public void onChanged(@Nullable User user) {
            mUnitSystem.postValue(user.getUnitSystem());
            mAge.postValue(user.getAge());
            mGender.postValue(user.getGender());
            mHeight.postValue(user.getHeight());
        }
    });
    userMediatorLiveData.observeForever(new Observer<User>() {
        @Override
        public void onChanged(@Nullable User user) {
        }
    });
    mGender.addSource(mUnitSystem, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer integer) {

            mAge.postValue(integer + 10);
        }
    });
}

public LiveData<Integer> getGender() {
    return mGender;
}
public LiveData<Integer> getAge() {
    return mAge;
}
public LiveData<Integer> getUnitSystem() {
    return mUnitSystem;
}

// setter to them

Итак, это работает.Но, я действительно запутался в наблюденииForever () внутри ViewModel.Я знаю, что это не рекомендуется Google.

Я хочу более чистый подход.

Заранее спасибо!

...