Как правильно объединить Observables, содержащие событие нажатия и значение в RxJava2 / RxKotlin - PullRequest
0 голосов
/ 10 мая 2019

Я борюсь с одним вариантом использования RxJava и могу использовать какого-нибудь помощника.

Когда нажимается кнопка, я открываю диалоговое окно, чтобы позволить пользователю выбрать значение. Диалог требует начального значения, которое равно ранее выбранному значению (или значению по умолчанию). Я пытаюсь реализовать это так:

Observables.combineLatest(
            RxView.clicks(my_button),
            viewModel.valueObservable
        )
            .subscribe { clickAndValuePair->
                showDialog(
                    initialValue = clickAndValuePair.second
                )
            }

Проблема в том, что при выборе нового значения снова открывается диалоговое окно, потому что новое значение генерируется в этой комбинированной наблюдаемой. Как лучше всего справляться с такой ситуацией?

1 Ответ

3 голосов
/ 10 мая 2019

Вы можете справиться с этим с помощью оператора zip():

Observables.zip(
    RxView.clicks(my_button),
    viewModel.valueObservable
).subscribe {
    showDialog(initialValue = it.second)
}

Операция zip соответствует каждому n -ому элементу наблюдаемых вместе, поэтому она всегда ждетза клик после испускания.Для этого вам нужно убедиться, что вы обновляете значение только из диалогового окна и всегда обновляете его оттуда.Даже если вы ничего не обновляли.


A лучшей альтернативой может быть просто получить последнее значение при каждом щелчке с помощью withLatestFrom()оператор:

RxView.clicks(my_button)
  .withLatestFrom(viewModel.valueObservable)
  .subscribe { showDialog(initialValue = it.second)}
...