Как просто добавить другой источник MediatorLiveData в kotlin? - PullRequest
0 голосов
/ 30 июня 2019

Я хочу объединить несколько источников данных в MediatorLiveData. К сожалению, примеров пока не так много. Так что в моей ViewModel у меня есть

//all lists have been declared before

val playerList = MediatorLiveData<List<Player>>()

init {
    playerList.addSource(footballPlayerList) { value ->
        playerList.value = value
    }
    playerList.addSource(basketballPlayerList) { value ->
        playerList.value = value
    }
}

Но, очевидно, это всегда будет переопределять текущее значение playerList. Я имею в виду, что мог бы создать несколько хакерских обходных путей с помощью вспомогательных переменных, таких как _playerList, но, возможно, есть более простое решение?

1 Ответ

0 голосов
/ 02 июля 2019

Проведя довольно небольшое исследование .. Я узнал это.Вот пример

fun blogpostBoilerplateExample(newUser: String): LiveData<UserDataResult> {

val liveData1 = userOnlineDataSource.getOnlineTime(newUser)
val liveData2 = userCheckinsDataSource.getCheckins(newUser)

val result = MediatorLiveData<UserDataResult>()

result.addSource(liveData1) { value ->
    result.value = combineLatestData(liveData1, liveData2)
}
result.addSource(liveData2) { value ->
    result.value = combineLatestData(liveData1, liveData2)
}
return result
}

Фактическая комбинация данных выполняется в отдельном методе combLatestData, например,

private fun combineLatestData(
    onlineTimeResult: LiveData<Long>,
    checkinsResult: LiveData<CheckinsResult>
): UserDataResult {

val onlineTime = onlineTimeResult.value
val checkins = checkinsResult.value

// Don't send a success until we have both results
if (onlineTime == null || checkins == null) {
    return UserDataLoading()
}

// TODO: Check for errors and return UserDataError if any.

return UserDataSuccess(timeOnline = onlineTime, checkins = checkins)
}
...