Как связать преобразования в Android при использовании живых данных?

Учитывая следующую настройку:

У меня есть 2 репозитория: репозиторий A и репозиторий B оба из них возвращают данные в реальном времени.

У меня есть ViewModel, который использует оба этих репозитория.

Я хочу извлечь что-то из репозитория A, и в зависимости от результата я хочу взять что-то из репозитория B, а затем преобразовать результат, прежде чем возвращаться в пользовательский интерфейс.

Для этого я изучал классы трансляции LiveData . В примерах показано единственное преобразование результата, но я хочу что-то по цепочке цепочки двух преобразований. Как я могу это сделать?

Я попытался настроить что-то вроде этого, но получить несоответствие типа во втором блоке преобразования:

internal val launchStatus: LiveData<String> = Transformations .map(respositoryA.getData(), { data -> if (data.isValid){ "stringA" } else { //This gives a type mismatch for the entire block Transformations.map(repositoryB.getData(), { result -> result.toString() }) } }) 

(Также, пожалуйста, дайте мне знать, есть ли альтернативный / рекомендуемый подход для захвата чего-то, чтобы связать этот вызов, то есть захватить что-то из A, а затем взять что-то из B в зависимости от результата A и так далее)

Я бы попытался использовать switchMap вместо map:

Подобно map (), применяет функцию к значению, хранящемуся в объекте LiveData, и разворачивает и отправляет результат вниз по течению. Функция, переданная switchMap (), должна возвращать объект LiveData.

Вы можете преобразовать данные с помощью switchmap . Вот пример документации .

Я использовал MediatorLiveData для решения этой проблемы.

MediatorLiveData может наблюдать другие объекты LiveData и реагировать на них.

Вместо того, чтобы наблюдать за каждым из репозиториев. Я создал myData (экземпляр MediatorLiveData) в моем классе ViewModel и вижу, что мой объект наблюдает за этим объектом. Затем я добавляю репозиторий A в качестве исходного источника и замечаю это и добавляю только репозиторий B, если для этого нужен результат A. Это позволяет мне сохранять преобразования, связанные с текущими данными каждого из репо, и обрабатывать каждый результат в правильном порядке. См. Ниже:

 internal val myData: MediatorLiveData<String> = MediatorLiveData() private val repoA: LiveData<String> = Transformations.map( respositoryA.getData(), { data -> if (data.isValid) "stringA" else "" }) private val repoB: LiveData<String> = Transformations.map( repositoryB.getData(), { data -> "stringB" }) fun start() { myData.addSource(repoA, { if (it == "stringA") { myData.value = it } else { launchStatus.addSource(repoB, { myData.value = it }) } }) } 

Примечание . Решение не распространяется на случаи, когда repoB может быть добавлен несколько раз, но он должен быть достаточно простым для обработки.