如何在RxJava2 / RxKotlin中正确组合包含单击事件和值的Observable

时间:2019-05-10 08:44:24

标签: android kotlin rx-java rx-java2

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

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

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

问题是,当选择新值时,对话框再次打开,因为在此组合的Observable中发出了新值。处理这种情况的最佳做法是什么?

1 个答案:

答案 0 :(得分:3)

您也许可以使用&& i !== i2运算符来处理此问题:

zip()

zip操作将可观察对象的每个 n 项匹配在一起,因此它始终在发出后等待单击。为此,您需要确保仅从对话框更新值,并始终从那里更新它。即使您没有更新任何内容。


更好的选择可能是只要在withLatestFrom()运算符单击时获取最新值:

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