LiveData из ViewModel
Принято наружу из ViewModel давать LiveData а не MutableLiveData. Как у вас это происходит?
Например, я делаю так:
private val _objectsState: MutableLiveData<ObjectListUIState> = MutableLiveData()
val objectsState: LiveData<ObjectListUIState> get() = _objectsState
Например, появляются всякие:
private val _mapBoundState: MutableLiveData<BoundBox> = MutableLiveData()
val mapBoundState: LiveData<BoundBox> get() = _mapBoundState
private val _bottomSheetVisibleState: MutableLiveData<Booleand> = MutableLiveData()
val bottomSheetVisibleState: LiveData<Booleand> get() = _bottomSheetVisibleState
private val _mapTileTypeState: MutableLiveData<TileType> = MutableLiveData()
val mapTileTypeState: LiveData<TileType> get() = _mapTileTypeState
и т.д. Можно как то по другому это делать? (чтобы кода по меньше)
Ответы (1 шт):
Автор решения: Sergei Buvaka
→ Ссылка
Можете использовать sealed class и постить состояния.
Пример:
sealed class State {
data class DataLoaded(val data: List<YourData>) : State()
data class Error(val error: Exception) : State()
object Loading : State()
}
и создать одну LiveData
val stateLiveData = MutableLiveData<State>()
К примеру вы стартуете загрузку вы передаете
stateLiveData.post(State.Loading)
при получении данных
stateLiveData.post(State.Data(data))
Собственно во View у вас есть метод что-то вроде такого:
fun handleState(state: State){
when (state){
is Loading -> showLoader()
is Error -> showError(state.error)
is DataLoaded -> showData(state.data)
}
}