【问题标题】:LiveData Observer still observing when going back to the fragment返回片段时 LiveData Observer 仍在观察
【发布时间】:2018-12-12 13:38:37
【问题描述】:

所以我有这个代码,当我按下按钮时

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 的新手,所以请。谢谢:)

【问题讨论】:

    标签: android mvvm kotlin


    【解决方案1】:

    字段viewModel.loginState 就像它被命名为一个位于viewModel 中的状态。当您导航到导航时,观察将暂停,但在您导航返回后也会重新启动。由于您不更改状态本身,也许只是关闭对话框,您最终会看到与以前相同的屏幕。

    因此,当您关闭对话框时,只需将状态更新为更相关的值。

    【讨论】:

    • 感谢您提供此解决方法!这行得通,但这是解决此类问题的最佳做法吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多