v79
10/30/2022, 8:38 AMmutableStateOf
in this way...
val totalCost by remember {
mutableStateOf(Field(mutableStateOf("1.01"), validator = CurrencyValidator))
}
v79
10/30/2022, 8:40 AM// a wrapper containing this weird extra mutableState for the text which is input
class Field(
var value: MutableState<String> = mutableStateOf(""),
var valid: Boolean = true,
val validator: FieldValidator? = null
) {
var message: String = ""
fun onFieldUpdate(newValue: String) {
valid = validator?.validate(newValue) ?: true
value.value = newValue
message = if (!valid) {
"Invalid"
} else {
""
}
}
}
// in my screen
val totalCost by remember {
mutableStateOf(Field(mutableStateOf("1.01"), validator = CurrencyValidator))
}
CurrencyTextField(
modifier = Modifier.weight(1f),
field = totalCost,
value = totalCost.value.value,
onValueChange = { totalCost.onFieldUpdate(it) },
enabled = inputEnabled,
label = R.string.screen_recordCharge_totalCost
)
// definition of CurrencyTextField
@Composable
fun CurrencyTextField(
modifier: Modifier = Modifier,
field: Field,
value: String,
enabled: Boolean = true,
onValueChange: (String) -> Unit,
@StringRes label: Int
) {
OutlinedTextField(
modifier = modifier,
value = value,
onValueChange = onValueChange,
singleLine = true,
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Number,
imeAction = ImeAction.Next
),
isError = !field.valid,
colors = TextFieldDefaults.outlinedTextFieldColors(textColor = md_theme_light_onSurface),
enabled = enabled,
label = { Text(stringResource(label)) },
supportingText = { Text(field.message) }
)
}
v79
10/30/2022, 9:02 AMvalue = totalCost.value.value
when declaring the CurrencyTextField
.Ben Trengrove [G]
10/31/2022, 6:42 AMBen Trengrove [G]
10/31/2022, 6:43 AMval totalCost by remember {
Field(mutableStateOf("1.01"), validator = CurrencyValidator)
}
Ben Trengrove [G]
10/31/2022, 6:44 AMclass Field(initialValue: Int, ...) {
var fieldValue by mutableStateOf(initialValue)
}
Ben Trengrove [G]
10/31/2022, 6:45 AMv79
10/31/2022, 7:47 AMv79
10/31/2022, 6:02 PMremember
function as per the state holder documentation:
@Composable
fun rememberFieldState(initialValue: String = "", validator: FieldValidator? = null) = remember {
Field(mutableStateOf(initialValue), validator = validator)
}
Which is used like this:
val totalCost = rememberFieldState(initialValue = "1.01", validator = CurrencyValidator)
It's working as intended. Hopefully that's a bit more idiomatic.v79
11/06/2022, 2:40 PM