gpt4 book ai didi

android - 使用 RxJava2 PublishSubject 管理 null bool 值

转载 作者:行者123 更新时间:2023-11-29 19:12:43 27 4
gpt4 key购买 nike

我正在实现 MVP 设计模式。我的演示者从 View 中接收到新值。我想通过在 View 上更新值时自动检查所有内容是否有效来管理下一步按钮的状态。

在我的表单中,我有一个可选部分,只有当用户选择正确的选项时才会显示。在这个可选部分中,我有一个二元问题。如果未显示该部分,我需要在 Presenter 端将问题的值设置为 null。例如,用户选择选项并显示可选部分。用户选择答案。然后用户更改选项,可选部分被隐藏。在这种情况下,我需要将可选问题的答案设置为空,以便在用户再次显示可选部分时不会选择答案。

为此,我使用空值而不是 true/false 在 Presenter 上调用一个方法。

代码如下:

private final PublishSubject<Boolean> mObsOptionalAnswer = PublishSubject.create();

public MyPresenter(){
// Combine all the values together to enable/disable the next button
Observable.combineLatest(
// ... other fields
// I need this to return false if the optional part is
// displayed but nothing is selected
mObsOptionalAnswer.map(this::isValid),
(...) -> ...
).subscrible(enable ->{
mView.enableBtn(enable);
});
}

public void myFunction(Boolean isSomething){
// ... some code
mObsOptionalAnswer.onNext(isSomething);
}

private boolean isValid(Boolean value){
return value != null;
}

问题是,从 RxJava 2 开始,onNext() 方法中不允许使用 null 值。那么,我该如何管理呢?

最佳答案

如果您希望能够发送一个空值,您可以使用一个包装器。在此配置中,您发送包装器,即使值本身为 null,它也不是 null。

public class BooleanWrapper {

public final Boolean value;

public BooleanWrapper(Boolean value) {
this.value = value;
}
}

你的 PublishSubject<Boolean>变成 PublishSubject<BooleanWrapper>你只需要创建包装器并在需要时取消引用你的 bool 值:

mObsOptionalAnswer.onNext(new BooleanWrapper(isSomething));

mObsOptionalAnswer.map(wrapper -> this.isValid(wrapper.value))

如果您需要在代码中多次执行此操作,您可以创建一个通用包装器(如 this tutorial 所述):

public class Optional<M> {

private final M optional;

public Optional(@Nullable M optional) {
this.optional = optional;
}

public boolean isEmpty() {
return this.optional == null;
}

public M get() {
return optional;
}
}

关于android - 使用 RxJava2 PublishSubject 管理 null bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720971/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com