首页 > 解决方案 > 如何从登录用户返回布尔值

问题描述

您好,我正在 kotlin 中做 mvvm 项目,我使用空间登录和注册新用户。

部分代码:

    view.login_btn.setOnClickListener {
        val takenUsername = username.text.toString()
        val takenPassword = password.text.toString()

        if(takenUsername.isEmpty() || takenPassword.isEmpty()){
            Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
        }else{
            //Zwraca unity (naprawic to a nie null
            val userEntity  = mMainActivityViewModel.checkLogin(takenUsername,takenPassword)

            if(userEntity.equals(null)){
                Toast.makeText(context!!, "Bad login or password", Toast.LENGTH_SHORT).show()
            }else{

                Toast.makeText(context!!, "Login successfull", Toast.LENGTH_SHORT).show()
            }
        }
    }

我不明白为什么,但这个函数返回一个不是 null 的单位。我完全不知道。

有人可以建议我应该在第 11 行放什么而不是 null 吗?

标签: androidkotlin

解决方案


我的朋友,您采取了错误的方法。您需要使用实时数据从视图模型中获取回调。

private fun setupLoginObserver() {
    mMainActivityViewModel.loginStatus.observe(this, Observer { isValidUser ->
        if (isValidUser) {
            Toast.makeText(requireContext(), "Login successful", Toast.LENGTH_SHORT).show()
        } else {
            Toast.makeText(requireContext(), "Bad login or password", Toast.LENGTH_SHORT).show()
        }
    })
}

您可以从 onViewCreated() 调用此方法

您的按钮单击侦听器应如下所示:

view.login_btn.setOnClickListener {
        val takenUsername = username.text.toString()
        val takenPassword = password.text.toString()

        if (takenUsername.isEmpty() || takenPassword.isEmpty()) {
            Toast.makeText(context, "Fill all columns", Toast.LENGTH_SHORT).show()
        } else {
            //Check user is valid or not in db and you will get the callback on line #
            mMainActivityViewModel.checkLogin(takenUsername, takenPassword)
        }
    }

视图模型:

fun checkLogin(username: String, password: String) {
    viewModelScope.launch(Dispatchers.IO) {
        repository.loginUser(username, password)?.let {
            mutableLoginStatus.postValue(true)
        } ?: mutableLoginStatus.postValue(false)
    }
}

用户存储库:

suspend fun loginUser(username: String, password: String): User? {
    return userDao.loginUser(username, password)
}

最后是 UserDao:

@Query("SELECT user_table.* FROM user_table WHERE username= :username AND password=:password")
   suspend fun  loginUser(username: String, password: String): User?

我对您的代码做了一些必要的更改并推送到了这个分支。

https://github.com/parmeshtoyou/Querto/tree/user_validate_through_live_data_stackoverflow

您可以查看更改。

如果您需要任何澄清,请告诉我。

快乐编码。


推荐阅读