在初始化主题时防止订阅中的代码执行

Preventing code in subscribe from executing when subject is initialized

在此代码中:

class RequestNewPasswordFragment {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        btnRequestNewPassword.setOnClickListener {
            view.hideKeyboard()
            viewModel.validateEmail(txtInputLayoutEmail.textValue)
        }

        disposables += viewModel.emailValidationSubject
            .observeOnMainThread()
            .subscribe { validationResponse ->
               viewModel.requestNewPassword()
            }

}

当片段被初始化时,emailValidationSubject 被初始化。这会导致 subscribe 中的代码执行,从而调用 viewModel 中的 requestNewPassword。我想避免这种情况。我希望仅在单击 btnRequestNewPassword 时调用它。 subscribe 中的代码应该只在 viewModel 需要验证输入时被调用。如何防止 viewModel.requestNewPassword() 在片段初始化时被调用?

我假设你的 emailValidationSubject 是一个基于你之前问题 的 BehaviourSubject。

BehaviourSubject 将始终在订阅时发出一个值,因此您需要提供一个初始值。

it begins by emitting the item most recently emitted by the source Observable (or a seed/default value if none has yet been emitted)

您需要使用 PublishSubject:

PublishSubject emits to an observer only those items that are emitted by the source Observable(s) subsequent to the time of the subscription.