Предотвращение выполнения кода в подписке при инициализации субъекта - PullRequest
0 голосов
/ 19 сентября 2019

В этом коде:

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 инициализируется.Это приводит к выполнению кода в подписке, который вызывает запрос requestNewPassword в viewModel.Я хочу избежать этого.Я хочу, чтобы это вызывалось только при нажатии btnRequestNewPassword.Код в подписке должен вызываться только тогда, когда viewModel нужно проверить ввод.Как я могу предотвратить вызов viewModel.requestNewPassword() при инициализации фрагмента?

1 Ответ

2 голосов
/ 19 сентября 2019

Я предполагаю, что ваш emailValidationSubject является BehaviourSubject на основе вашего предыдущего вопроса здесь .

BehaviourSubject всегда будет указывать значение при подписке, следовательно, вынужно предоставить начальное значение.

он начинается с испускания элемента, который последний раз испускал наблюдаемый источник (или начальное значение / значение по умолчанию, если еще не было выпущено ничего)

Вам необходимо использовать PublishSubject :

PublishSubject отправляет наблюдателю только те элементы, которые испускаются исходными Наблюдаемыми объектами после времени подписки.

...