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)
    }
}
→ Ссылка