对同一个 ViewModel 中的 LiveData 变化做出反应
Reacting to LiveData change within same ViewModel
我有一个基础 ViewModel
由其他 ViewModel
扩展:
abstract class BaseViewModel : ViewModel() {
protected val _state = MutableLiveData<Boolean>()
protected val state: LiveData<Boolean> = _state
...
}
我希望能够在 state
更改(调用 _state.setValue(newvalue)
或 _state.postValue(newvalue)
时做出反应(例如,添加日志语句)并且我会喜欢在BaseViewModel
里面做。
我该怎么做?
然后
protected val state: LiveData<Boolean> = _state
state
实际上应该是一个 MediatorLiveData
,它将 _state
注册为它的来源。
final MediatorLiveData<T> mediator = new MediatorLiveData<>();
mediator.addSource(_state, new Observer<T>() {
@Override
public void onChanged(@Nullable T data) {
// log here
mediator.postValue(data);
}
});
return mediator;
所以在你的情况下,它应该是这样的:
protected val state: LiveData<Boolean> = MediatorLiveData().also { mediator ->
mediator.addSource(_state) { data ->
// log here
mediator.postValue(data)
}
}
我有一个基础 ViewModel
由其他 ViewModel
扩展:
abstract class BaseViewModel : ViewModel() {
protected val _state = MutableLiveData<Boolean>()
protected val state: LiveData<Boolean> = _state
...
}
我希望能够在 state
更改(调用 _state.setValue(newvalue)
或 _state.postValue(newvalue)
时做出反应(例如,添加日志语句)并且我会喜欢在BaseViewModel
里面做。
我该怎么做?
然后
protected val state: LiveData<Boolean> = _state
state
实际上应该是一个 MediatorLiveData
,它将 _state
注册为它的来源。
final MediatorLiveData<T> mediator = new MediatorLiveData<>();
mediator.addSource(_state, new Observer<T>() {
@Override
public void onChanged(@Nullable T data) {
// log here
mediator.postValue(data);
}
});
return mediator;
所以在你的情况下,它应该是这样的:
protected val state: LiveData<Boolean> = MediatorLiveData().also { mediator ->
mediator.addSource(_state) { data ->
// log here
mediator.postValue(data)
}
}