Возникает ошибка, если пароли не совпадают при регистрации

#android #kotlin #fragment

Вопрос:

Я пытаюсь заставить свой фрагмент регистрации показывать ошибку, если пароли не совпадают, но я вижу только ошибку, которая запрашивает буквенно-цифровые символы (но даже если я наберу это, похоже, не работает). Что я делаю не так?

Это модель представления, в которой я настраиваю условия для возникновения ошибки, если они не выполняются:

 class SignUpViewModel(private val signUpRepository: SignUpRepository) : ViewModel() {

    private val _signUpForm = MutableLiveData<SignUpFormState>()
    val signUpFormState: LiveData<SignUpFormState> = _signUpForm

    fun signUp(name: String, email:String, password: String) {

    }

    fun signUpDataChanged(email:String, password: String, confirmPassword: String) {
        if (!isEmailValid(email)) {
            _signUpForm.value = SignUpFormState(emailError = R.string.invalid_email)
        } else if (!isPasswordValid(password)) {
            _signUpForm.value = SignUpFormState(passwordError = R.string.invalid_password_signUp)
        } else if (!passwordsMatch(password,confirmPassword)){
            _signUpForm.value = SignUpFormState(confirmPasswordError = R.string.mismatched_password)
        }
        else {
            _signUpForm.value = SignUpFormState(isDataValid = true)
        }
    }

    // A placeholder username validation check
    private fun isEmailValid(email: String): Boolean {
        return if (email.contains('@')) {
            Patterns.EMAIL_ADDRESS.matcher(email).matches()
        } else {
            email.isNotBlank()
        }
    }

    // A placeholder password validation check
    private fun isPasswordValid(password: String): Boolean {
        return password.contains("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9] $")
    }

    //check if passwords are the same
    private fun passwordsMatch(password: String, confirmPassword:String): Boolean{
        return password == confirmPassword
    }
}
 

Это фрагмент:

 class SignUpFragment : Fragment() {
    private lateinit var binding: FragmentSignupBinding

    private lateinit var signUpViewModel: SignUpViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = FragmentSignupBinding.inflate(inflater, container, false)

        val nameInput = binding.etName
        val emailInput = binding.etEmail
        val passwordInput = binding.etPassword
        val confirmPasswordInput = binding.etConfirmPassword
        val signupButton = binding.btSignUp

        signUpViewModel = ViewModelProvider(this, SignUpViewModelFactory())
            .get(SignUpViewModel::class.java)

        signUpViewModel.signUpFormState.observe(viewLifecycleOwner, Observer {
            val signUpState = it ?: return@Observer

            // disable sign up button unless fields are valid
            signupButton.isEnabled = signUpState.isDataValid

            if (signUpState.emailError != null) {
                emailInput.error = getString(signUpState.emailError)
            }
            if (signUpState.passwordError != null) {
                passwordInput.error = getString(signUpState.passwordError)
            }

            if (signUpState.confirmPasswordError != null) {
                confirmPasswordInput.error = getString(signUpState.confirmPasswordError)
            }
        })

        emailInput.afterTextChanged {
            signUpViewModel.signUpDataChanged(
                emailInput.text.toString(),
                passwordInput.text.toString(),
                confirmPasswordInput.text.toString()
            )
        }

        passwordInput.afterTextChanged {
                signUpViewModel.signUpDataChanged(
                    emailInput.text.toString(),
                    passwordInput.text.toString(),
                    confirmPasswordInput.text.toString()
                )
        }

        confirmPasswordInput.apply {
            afterTextChanged {
                signUpViewModel.signUpDataChanged(
                    emailInput.text.toString(),
                    passwordInput.text.toString(),
                    confirmPasswordInput.text.toString()
                )
            }

            setOnEditorActionListener { _, actionId, _ ->
                when (actionId) {
                    EditorInfo.IME_ACTION_DONE ->
                        signUpViewModel.signUp(
                            emailInput.text.toString(),
                            passwordInput.text.toString(),
                            confirmPasswordInput.text.toString()
                        )
                }
                false
            }
        }


            return binding.root
        }

    }

    fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
        this.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(editable: Editable?) {
                afterTextChanged.invoke(editable.toString())
            }

            override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

            override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
        })
    }

 

Ответ №1:

  1. String.contains соответствует подстроке, а не регулярному выражению , для использования в регулярных выражениях
 val regex = Regex("^(?=.*[a-zA-Z])(?=.*[0-9])[a-zA-Z0-9] $")

assertTrue(regex.containsMatchIn("xabcdy"))
 
  1. Для вашей функции сопоставления сначала попробуйте войти в систему , а затем используйте String.trim() для неожиданных пробелов.