Android 如何在RxJava2/RxKotlin中正确组合包含点击事件和值的观察值
我正在处理一个RxJava用例,可能需要一些助手 单击按钮时,我会打开一个对话框,让用户选择一个值。对话框需要初始值,该值等于先前选择的值(或默认值)。我尝试这样实现它: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->
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是一个理想的解决方案。谢谢