首页 > 解决方案 > 在我的 ViewModel 中观察(并处理)LiveData。然后才通过 if 来查看,通过拆分为更小的 LaveData 对象

问题描述

我想要:

  1. 将数据提取到我的 ViewModel。

  2. 在 LiveData 对象上拆分它。

  3. 用它做一些事情,然后才将它传递给我的视图。

一些用户选项相互依赖。例如,更改mGender必须更改mage 所以,这就是我所做的

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

视图模型

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

所以,它的工作。但是,我真的对 ViewModel 中的 observeForever() 感到困惑。我知道谷歌不建议这样做。

我想要更干净的方法。

先感谢您!

标签: androidandroid-roomandroid-livedata

解决方案


推荐阅读