首页 > 解决方案 > 如何在 RxJava2/RxKotlin 中正确组合包含点击事件和值的 Observables

问题描述

我正在为一个 RxJava 用例而苦苦挣扎,可以使用一些助手。

单击按钮时,我会打开一个对话框让用户选择一个值。对话框需要等于先前选择的值(或默认值)的初始值。我尝试像这样实现它:

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

The problem is, when new value is picked the dialog is opened again, because new value is emitted in this combined Observable. 处理这种情况的最佳做法是什么?

标签: androidkotlinrx-javarx-java2

解决方案


您可能可以使用zip()操作员处理此问题:

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

zip 操作将每个可观察对象的第n个项目匹配在一起,因此它总是在发射后等待点击。为此,您需要确保只更新对话框中的值并始终从那里更新它。即使你没有更新任何东西。


更好的选择可能是在withLatestFrom()操作员单击时获取最新值:

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

推荐阅读