如何在两个字段中验证用户输入
password
和
confirmPassword
在喷气背包组成。我试过
var matchError
但当密码不匹配时,它不会显示错误。我该怎么解决这个问题?此外,我如何从中引用密码字段
ConfirmPasswordTextFieldComponent
作用当用户键入
confirmPassword
字段。
@Composable
fun ConfirmPasswordTextFieldComponent(
text: String,
labelValue: String,
confirmText:String, painterResource: Painter,
onTextChanged: (String) -> Unit,
hasError: Boolean = false,
) {
val localFocusManager = LocalFocusManager.current
val password = remember {
mutableStateOf("")
}
val passwordVisible = remember {
mutableStateOf(false)
}
val matchError = remember { mutableStateOf(false) }
OutlinedTextField(
modifier = Modifier
.fillMaxWidth()
.clip(componentShapes.small),
label = { Text(text = labelValue) },
colors = TextFieldDefaults.outlinedTextFieldColors(
focusedBorderColor = Primary,
focusedLabelColor = Primary,
cursorColor = Primary,
backgroundColor = BgColor
),
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Password,
imeAction = ImeAction.Done
),
singleLine = true,
keyboardActions = KeyboardActions {
localFocusManager.clearFocus()
},
maxLines = 1,
value = password.value,
onValueChange = {
password.value = it
onTextChanged(it)
},
leadingIcon = {
Icon(painter = painterResource, contentDescription = "")
},
trailingIcon = {
val iconImage = if (passwordVisible.value) {
Icons.Filled.Visibility
} else {
Icons.Filled.VisibilityOff
}
val description = if (passwordVisible.value) {
stringResource(id = R.string.hide_password)
} else {
stringResource(id = R.string.show_password)
}
IconButton(onClick = { passwordVisible.value = !passwordVisible.value }) {
Icon(imageVector = iconImage, contentDescription = description)
}
},
isError = hasError || matchError.value,
visualTransformation = if (passwordVisible.value) VisualTransformation.None else PasswordVisualTransformation(),
)
Spacer(modifier = Modifier.height(8.dp))
if (confirmText != text) {
Text(
text = stringResource(id = R.string.error_password_no_match),
color = colorResource(id = R.color.colorSoftRed300),
fontSize = 10.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.semantics { contentDescription = "ConfirmPasswordMessage" },
)
matchError.value = true
} else {
matchError.value = false
}
}
密码文本字段组件:
@Composable
fun PasswordTextFieldComponent(
labelValue: String, painterResource: Painter,
onTextSelected: (String) -> Unit,
errorStatus: Boolean = false
) {
val localFocusManager = LocalFocusManager.current
val password = remember {
mutableStateOf("")
}
val passwordVisible = remember {
mutableStateOf(false)
}
OutlinedTextField(
modifier = Modifier
.fillMaxWidth()
.clip(componentShapes.small),
label = { Text(text = labelValue) },
colors = TextFieldDefaults.outlinedTextFieldColors(
focusedBorderColor = Primary,
focusedLabelColor = Primary,
cursorColor = Primary,
backgroundColor = BgColor
),
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Password,
imeAction = ImeAction.Done
),
singleLine = true,
keyboardActions = KeyboardActions {
localFocusManager.clearFocus()
},
maxLines = 1,
value = password.value,
onValueChange = {
password.value = it
onTextSelected(it)
},
leadingIcon = {
Icon(painter = painterResource, contentDescription = "")
},
trailingIcon = {
val iconImage = if (passwordVisible.value) {
Icons.Filled.Visibility
} else {
Icons.Filled.VisibilityOff
}
val description = if (passwordVisible.value) {
stringResource(id = R.string.hide_password)
} else {
stringResource(id = R.string.show_password)
}
IconButton(onClick = { passwordVisible.value = !passwordVisible.value }) {
Icon(imageVector = iconImage, contentDescription = description)
}
},
visualTransformation = if (passwordVisible.value) VisualTransformation.None else PasswordVisualTransformation(),
isError = !errorStatus
)
}