当我单击一个按钮时,我正在尝试使用 RxJava 对 EditText 执行验证,但我很难将验证移至 ViewModel,这将使测试变得更加容易。我正在使用来自 Jake Wharton 的 RxBindings 来获取 UI 输入,并使用带有 PublishSubject 的 RxJava2 的 Flowable.combineLatest 在我单击 AlertDialog 上的按钮时触发 Flowable。这是我到目前为止得到的:
private Flowable<CharSequence> projectTitleObservable;
private final PublishSubject<CharSequence> createProjectClicked = PublishSubject.create();
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final Context context = getActivity();
View dialogView = LayoutInflater.from(context).inflate(R.layout.new_project, null);
ButterKnife.bind(this, dialogView);
projectTitleObservable = RxTextView.textChanges(projectNameEditText).toFlowable(BackpressureStrategy.LATEST);
ConnectableFlowable <CharSequence> connectableFlowable = Flowable.combineLatest(createProjectClicked.toFlowable(BackpressureStrategy.LATEST), projectTitleObservable, (ignored, title) -> {
boolean validTitle = !TextUtils.isEmpty(title);
if (!validTitle) {
projectNameEditText.setError("Project must have a name");
}
Timber.d("Hey, lambdas work! Look -> " + title);
return title;
})
.publish();
connectableFlowable.subscribe(test -> Timber.d(test.toString()));
return new AlertDialog.Builder(context)
.setTitle("Add new Project")
.setView(dialogView)
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
Timber.d("Ok clicked!");
createProjectClicked.onNext("It works!");
})
.setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> Timber.d("Cancel clicked!"))
.create();
}
我只是在同一个地方发布和订阅,以确保它在将 ConnectableFlowable 移动到 ViewModel 之前确实有效。我得到的唯一日志是“确定点击!” 这对我来说意味着它从未被订阅过。关于为什么不订阅的任何想法?