Почему Transformation.switchMap (anyLiveData) не срабатывает, когда я изменяю значение anyLiveData - PullRequest
0 голосов
/ 13 февраля 2020

Буду надеяться, что когда я вызову «addPlantToGarden ()», передав параметр «plantId», относящийся к параметру уважения, то вызову «наблюдатели» «Transformations.switchMap (plantName)», но этого не происходит, в чем же ошибка?


private val plantName: MutableLiveData<String> = MutableLiveData()

    val plant: LiveData<Plant> = Transformations.switchMap(plantName){plantId ->
        plantRepository.getPlant(plantId)
    }

    val isPlanted: LiveData<Boolean> = Transformations.switchMap(plantName){plantId ->
        gardenPlantingRepository.isPlanted(plantId)
    }


    fun addPlantToGarden(plantId: String) {
        plantName.value = plantId
    }

1 Ответ

1 голос
/ 13 февраля 2020

Вот несколько вещей, которые следует учитывать:

1. Проверьте свой репозиторий

Убедитесь, что ваш plantRepository.getPlant(plantId) возвращает LiveData. Поскольку методы из репозитория выполняются в фоновом режиме, я предпочитаю инкапсулировать функцию, используя это:

liveData {
    // some async process (e.g. HTTP Request)
    emit(/*your value*/)
}

Ссылка: https://developer.android.com/topic/libraries/architecture/coroutines#livedata

2. Проверьте своего наблюдателя

Наблюдаете ли вы за правильным представителем владельца жизненного цикла? Если ваша ViewModel находится внутри фрагмента, убедитесь, что вы сделали следующее:

viewModel.plant.observe(viewLifecycleOwner, Observer{
    // action
})

вместо:

viewModel.plant.observe(this, Observer{
    // action
})

И убедитесь, что наблюдали сначала , прежде чем пытаться измените значение plantName.

3. Начните с простого случая

Понятия не имею, как вы изменили значение plantName. Но сначала попробуйте ввести простое жестко запрограммированное значение, например:

plantName.value = "1"

, затем проследите его через свой репозиторий, а затем - до своего наблюдателя. Надеюсь, это поможет вам.

...