LiveData Observer все еще наблюдает при возвращении к фрагменту - PullRequest
0 голосов
/ 12 декабря 2018

Итак, у меня есть этот код, который, когда я нажимаю кнопку

btnLogin.setOnClickListener {
    val user = UserLogin(etUsername.text.toString(), etPassword.text.toString())
    viewModel.login(user)
}

, я буду наблюдать это

fun login(user: UserLogin) {
    loginGateway.loginBuyer(user)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe { _loginState.postValue(LoginLoading) }
            .subscribe({
                if(it.data != null)
                    _loginState.postValue(LoginSuccess(it.data))
                else
                    _loginState.postValue(LoginFailed(it.message))
            }, {
                _loginState.postValue(LoginError(it.localizedMessage))
            })
            .addTo(disposable)
}

, а вот наблюдатель

        viewModel.loginState.observe(this, Observer {it ->
        when (it) {
            LoginLoading -> {
                dialog.show()
            }

            is LoginSuccess -> {
                dialog.dismiss()
                if (cbRemember.isChecked)
                    viewModel.saveUsername(etUsername.text!!.toString())
                viewModel.saveFirstname(it.user.firstName)
                findNavController().navigate(R.id.toMain)
            }

            is LoginFailed -> {
                dialog.dismiss()
                showErrorDialog(this.context!!, "Login Failed", it.message)
            }

            is LoginError -> {
                dialog.dismiss()
                showErrorDialog(this.context!!, "Login Error", it.message)
            }

        }
   })

Так что это проблема, когда мне не удалось войти в систему, чтобы он отображал диалоговое окно, а когда было закрыто, и когда я захожу на страницу регистрации и возвращаюсь, чтобы войти в систему, то же диалоговое окно все еще появляется.

Я пытался сделатьнапример, поставить removeObservers(this) на onPause () и onDestroy (), но все равно.Я не совсем уверен, если проблема заключается в жизненном цикле фрагмента, если нет, пожалуйста, помогите мне понять, что происходит.Я новичок в kotlin и mvvm, пожалуйста.Спасибо:)

1 Ответ

0 голосов
/ 12 декабря 2018

Поле viewModel.loginState похоже на то, что оно называется состоянием, которое живет в пределах viewModel.Когда вы перейдете к навигации, наблюдение будет приостановлено, но также возобновлено после того, как вы вернетесь назад.Поскольку вы не изменяете само состояние, возможно, только закрываете диалоговое окно, вы получите тот же экран, что и раньше.

Так что просто обновите состояние до более релевантного значения, когда закрываете диалоговое окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...