如何在 Kotlin 中使用 Room 管理登录验证?

How to manage Login Validation with Room in Kotlin?

我正在尝试使用登录验证表单,但程序停止然后到达第二个 if,并且我有 无效的电子邮件 输出。 运行清晰无误。无法弄清楚我做错了什么以及为什么 emailListnull

    private fun logIn() {
    val email = binding.editEmailAddress.text.toString()
    val password = binding.editPassword.text.toString()
    if (inputCheck(email, password)) {
        mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
        val emailList = mLoginViewModel.getUserEmail(email)
        if (emailList != null) {
            if (emailList.password == password) {
                Toast.makeText(requireContext(), "Logged in as $email", Toast.LENGTH_LONG)
                    .show()
                findNavController().navigate(R.id.action_loginFragment_to_listFragment)
            } else {
                Toast.makeText(requireContext(), "Invalid password", Toast.LENGTH_SHORT).show()
            }
        } else {
            Toast.makeText(requireContext(), "Invalid email", Toast.LENGTH_SHORT).show()
        }
    } else {
        Toast.makeText(requireContext(), "Fill out blank fields", Toast.LENGTH_LONG).show()
    }
}

private fun inputCheck(email: String, password: String): Boolean {
    return !(TextUtils.isEmpty(email) || TextUtils.isEmpty(password))
}

登录视图模型

    fun getUserEmail(email: String): User? {
    var checker: User? = null
    viewModelScope.launch(Dispatchers.IO) {
        checker = repository.getUserEmail(email)
    }
    return checker
}
fun getUserEmail(email: String): User? {
    var checker: User? = null
    viewModelScope.launch(Dispatchers.IO) {
        checker = repository.getUserEmail(email)
    }
    return checker 
    // Will return null always because this is not waiting to assign value by above repository method
}

告诉你可以做到这一点

suspend fun getUserEmail(email: String): User? {
    return repository.getUserEmail(email)
}

并在Activity或片段

mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
lifecycleScope.launch {
    val emailList = mLoginViewModel.getUserEmail(email)
}

不知道你在上面的代码中遇到了什么错误,如果上面的代码不起作用,那么使用下面的代码

mLoginViewModel = ViewModelProvider(this)[LoginViewModel::class.java]
    CoroutineScope(Dispatchers.IO).launch {
        val emailList = mLoginViewModel.getUserEmail(email)
        withContext(Dispatchers.Main){
            //Do whatever with emailList
        }
    }