'How to show error message in OutlinedTextField in Jetpack Compose
I need to show error message in OutlinedTextField and I don't find any documentation about how to do it. I found several ways in tutorials, for example to create custom input field with hint or create Text just below input field, but they very old and maybe there is a better way. I need show error message like this:
Code:
@Composable
fun EmailInputField(value: MutableState<String>, state: AuthState) {
OutlinedTextField(
value = value.value,
onValueChange = { value.value = it },
modifier = Modifier.fillMaxWidth(1f).height(60.dp),
textStyle = TextStyle(color = Color.White),
label = { Text(text = "Email", color = Color.White) },
colors = TextFieldDefaults.outlinedTextFieldColors(
focusedBorderColor = blue,
unfocusedBorderColor = Color.White
),
isError = state is AuthState.ValidationError,
singleLine = true
)
}
Solution 1:[1]
The TextField
components doesn't support an errorMessage
field.
You can easily achieve it using something like:
var text by rememberSaveable { mutableStateOf("") }
var isError by rememberSaveable { mutableStateOf(false) }
fun validate(text: String) {
isError = /* .... */
}
Column {
TextField(
value = text,
onValueChange = {
text = it
isError = false
},
trailingIcon = {
if (isError)
Icon(Icons.Filled.Error,"error", tint = MaterialTheme.colors.error)
},
singleLine = true,
isError = isError,
keyboardActions = KeyboardActions { validate(text) },
)
if (isError) {
Text(
text = "Error message",
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.caption,
modifier = Modifier.padding(start = 16.dp)
)
}
}
Solution 2:[2]
Here is a ready to use composable that you can copy paste into your code. It has a String
field called error
that will display the error whenever it is not empty (that way you only have one state variable to keep track of). It is a bit verbose so you are able to customize it as you would any OutlinedTextField
.
sample usage
OutlinedTextFieldValidation(
value = studentState.firstName.value,
onValueChange = { onFirstNameChange(it) },
label = { Text(text = "First name") },
error = "field cannot be empty"
)
code to copy:
@Composable
fun OutlinedTextFieldValidation(
value: String,
onValueChange: (String) -> Unit,
modifier: Modifier = Modifier.fillMaxWidth(0.8f),
enabled: Boolean = true,
readOnly: Boolean = false,
textStyle: TextStyle = LocalTextStyle.current,
label: @Composable (() -> Unit)? = null,
placeholder: @Composable (() -> Unit)? = null,
leadingIcon: @Composable (() -> Unit)? = null,
error: String = "",
isError: Boolean = error.isNotEmpty(),
trailingIcon: @Composable (() -> Unit)? = {
if (error.isNotEmpty())
Icon(Icons.Filled.Error, "error", tint = MaterialTheme.colors.error)
},
visualTransformation: VisualTransformation = VisualTransformation.None,
keyboardOptions: KeyboardOptions = KeyboardOptions.Default,
keyboardActions: KeyboardActions = KeyboardActions.Default,
singleLine: Boolean = true,
maxLines: Int = Int.MAX_VALUE,
interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
shape: Shape = MaterialTheme.shapes.small,
colors: TextFieldColors = TextFieldDefaults.outlinedTextFieldColors(
disabledTextColor = Color.Black
)
) {
Column(modifier = modifier
.padding(8.dp)) {
OutlinedTextField(
enabled = enabled,
readOnly = readOnly,
value = value,
onValueChange = onValueChange,
modifier = Modifier
.fillMaxWidth(),
singleLine = singleLine,
textStyle = textStyle,
label = label,
placeholder = placeholder,
leadingIcon = leadingIcon,
trailingIcon = trailingIcon,
isError = isError,
visualTransformation = visualTransformation,
keyboardOptions = keyboardOptions,
keyboardActions = keyboardActions,
maxLines = maxLines,
interactionSource = interactionSource,
shape = shape,
colors = colors
)
if (error.isNotEmpty()) {
Text(
text = error,
color = MaterialTheme.colors.error,
style = MaterialTheme.typography.caption,
modifier = Modifier.padding(start = 16.dp, top = 0.dp)
)
}
}
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | quealegriamasalegre |