Android 如何在RxJava2/RxKotlin中正确组合包含点击事件和值的观察值

Android 如何在RxJava2/RxKotlin中正确组合包含点击事件和值的观察值,android,kotlin,rx-java,rx-java2,Android,Kotlin,Rx Java,Rx Java2,我正在处理一个RxJava用例,可能需要一些助手 单击按钮时,我会打开一个对话框,让用户选择一个值。对话框需要初始值,该值等于先前选择的值(或默认值)。我尝试这样实现它: Observables.combineLatest( RxView.clicks(my_button), viewModel.valueObservable ) .subscribe { clickAndValuePair->

我正在处理一个RxJava用例,可能需要一些助手

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

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

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

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

Observables.zip(
    RxView.clicks(my_button),
    viewModel.valueObservable
).subscribe {
    showDialog(initialValue = it.second)
}
RxView.clicks(my_button)
  .withLatestFrom(viewModel.valueObservable)
  .subscribe { showDialog(initialValue = it.second)}
zip操作将观察到的每个第n项匹配在一起,因此它总是在发出后等待单击。为此,您需要确保仅从对话框中更新值,并始终从对话框中更新值。即使你没有更新任何东西


更好的选择可能是,只要单击操作符,就可以获取最新的值:

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

.withLatestFrom是一个理想的解决方案。谢谢