【问题标题】:How to correctly combine Observables containing click event and value in RxJava2/RxKotlin如何在 RxJava2/RxKotlin 中正确组合包含点击事件和值的 Observables
【发布时间】:2019-05-10 08:44:23
【问题描述】:

我正在为一个 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.处理这种情况的最佳做法是什么?

【问题讨论】:

    标签: android kotlin rx-java rx-java2


    【解决方案1】:

    您也许可以使用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)}
    

    【讨论】:

    • .withLatestFrom 是一个理想的解决方案。谢谢!
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 2019-07-12
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多