Вложенные наблюдатели с LiveData (наблюдение за наблюдателем)

У меня есть случай, когда у меня есть BottomNavigationView, где фрагменты отображаются/скрываются вместо добавления/замены, поэтому они не проходят свой жизненный цикл каждый раз.

Фрагмент 1 наблюдает за одной таблицей базы данных, Фрагмент 2 наблюдает за другой.

Моя цель - вызвать onChanged из Фрагмент 2, когда вызывается onChanged из Фрагмент 1.

Глупое и наивное решение, которое сработало, состояло в том, чтобы настроить наблюдателя Фрагмент 1 в Фрагмент 2 и внутри него вызвать другого наблюдателя:

mFragment1ViewModel1.getData().observe(this, new Observer<Fragment1Data>() {
    @Override
    public void onChanged(Fragment1Data fragment1Data) {
        if (fragment1Data != null){
            mFragmentViewModel2.getData().observe(SomeClass.this, new Observer<Fragment2Data>() {
                @Override
                public void onChanged(@Nullable Fragment2Data fragment2Data) {
                    // Do some stuff...
                }
            });
        }
    }
});

Может ли кто-нибудь сказать мне, что было бы хорошим решением в этом случае и последствиями решения, упомянутого выше?

Чувак, нет, используй MediatorLiveData, см. stackoverflow.com/a/54292960/2413303

EpicPandaForce 10.06.2019 01:11

@EpicPandaForce Я знаю, это ужасное решение: D. Я попытался реализовать MediatorLiveData очень быстро, но не до конца. Большое спасибо за ссылку. Так что, по сути, я просто добавлю Фрагмент 1 LiveData в качестве источника, а затем пойду оттуда?

Suleyman 10.06.2019 01:52

@EpicPandaForce Не могли бы вы сказать мне последнее, нужно ли мне использовать Transformations.switchMap?

Suleyman 11.06.2019 01:06

Эм-м-м. зависит от того, как вы пытаетесь связать LiveData с другим LiveData (или нет)

EpicPandaForce 11.06.2019 01:17

@EpicPandaForce Я попытаюсь объяснить, надеюсь, это не слишком запутывает. Все, что мне нужно от LiveData 1, это сообщить мне, когда был запущен метод onChanged, после чего я хочу выполнить onChanged LiveData 2. Я только что попытался внедрить MediatorLiveData, я добавляю оба источника, но при добавлении источника LiveData 1 у меня нет доступа к LiveData 2. Итак, я вижу в Фрагмент 2, что он распознает, когда сработал LiveData в Фрагмент 1, но я ничего не могу с этим поделать, так как у меня нет соответствующих данных.

Suleyman 11.06.2019 01:32
LiveData 1 is to tell me when it's onChanged method has been triggered, then I want to execute the onChanged of LiveData 2. на самом деле звучит так, будто это просто Transformations.switchMap(liveData1, (x) -> { return liveData2; }).observe(...
EpicPandaForce 11.06.2019 01:57

@EpicPandaForce, я попробую реализовать это, судя по моим небольшим исследованиям, похоже, это сработает. Большое спасибо за ваше время и терпение! :)

Suleyman 11.06.2019 09:45

@EpicPandaForce это сработало! Большое спасибо! Не хотите ли вы написать ответ, чтобы я мог принять его и проголосовать за него?

Suleyman 12.06.2019 22:00
2
8
1 873
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

LiveData 1 is to tell me when it's onChanged method has been triggered, then I want to execute the onChanged of LiveData 2

Это на самом деле звучит так, как будто это просто

Transformations.switchMap(liveData1, (x) -> { return liveData2; })
                 .observe(...

Другие вопросы по теме