正如 rx 中定义的 mixLatest 仅当所有值至少更改一次时才会发出。
(只要每个源 Observables 已发出至少一个
物品)
我用它来操作我的 android 视图中的视图。
例如,一旦所有可观察量发出有效值,我就会启用号召性用语按钮。否则我禁用它。
Observable.combineLatest(
toObservable(email),
toObservable(username),
toObservable(status),
toObservable(phonenumber),
toObservable(birthdate),
Function5<String, String, String, String, Date, Boolean> { email, username, status, phonenumber, birthdate ->
validator?.checkEmail(email) ?: true
// and much more...
}
).subscribeBy { ctaEnabled.set(it) }
有了这个片段ctaEnabled
仅当所有值至少更改一时才设置为 true。因为仅当所有 Observables 发出至少 1 个项目时才会调用 Function5。
但是,状态和出生日期字段是可选的,不得填写。
因为所有 ObservableFields 都用 null 初始化,并且不能显式设置为 null(rxjava 2 中不允许),当用户未在其中键入文本时,不会发出状态和生日。
val status: ObservableField<String> = ObservableField()
val phonenumber: ObservableField<String> = ObservableField()
val birthdate: ObservableField<Date> = ObservableField()
// ... and so on
我考虑过使用.startWith("")
这解决了字符串 Observables 的问题,因为所有字符串 Observables 至少发出一个空字符串。
但我不能将此解决方案用于日期字段,因为它可以为空。
Maybe combineLatest
不是我正在寻找的操作,但我找不到处理可选可观察量的正确方法。
致以最诚挚的问候和感谢,
莫里茨