Проблема с visualtransformation
У меня есть поля ввода текста:
var cardNumberRemember by rememberSaveable() { mutableStateOf("") }
OutlinedTextField(
value = cardNumberRemember,
onValueChange = {cardNumberRemember = it },
keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Number),
visualTransformation = { enteringValue.filter(it) },
colors = TextFieldDefaults.textFieldColors(
backgroundColor = White
)
)
Текст который я ввожу в поля, должен иметь форму: "0000 0000 0000 0000"
А вот класс с visualTransformation:
private val defaultCardNumber = "0000 0000 0000 0000" fun filter(cardNumber: AnnotatedString): TransformedText { val trimmed = if (cardNumber.text.length >= 16) { cardNumber.text.substring(0..15) } else { cardNumber.text } val annotatedString = AnnotatedString.Builder().run { for (i in trimmed.indices) { append(trimmed[i]) if (i % 4 == 3 && i != 15) { append(" ") } } pushStyle(SpanStyle(color = Color.LightGray)) append(defaultCardNumber.takeLast(defaultCardNumber.length - length)) toAnnotatedString() } val creditCardOffsetTranslator = object : OffsetMapping { override fun originalToTransformed(offset: Int): Int { if (offset <= 3) return offset if (offset <= 7) return offset + 1 if (offset <= 11) return offset + 2 if (offset <= 16) return offset + 3 return 19 } override fun transformedToOriginal(offset: Int): Int { if (offset <= 4) return offset if (offset <= 9) return offset - 1 if (offset <= 14) return offset - 2 if (offset <= 19) return offset - 3 return 16 } } return TransformedText(annotatedString, creditCardOffsetTranslator) }
Проблема в том, что при двойном клике на поля ввода, приложения вылетает вот с такой ошибкой:
FATAL EXCEPTION: main
Process: com.example.cardinfo, PID: 2931
java.lang.IllegalStateException: OffsetMapping.transformedToOriginal returned invalid mapping: 5 -> 4 is not in range of original text [0, 0]
at androidx.compose.foundation.text.ValidatingOffsetMapping.transformedToOriginal(ValidatingOffsetMapping.kt:69)
at androidx.compose.foundation.text.TextFieldDelegate$Companion.setCursorOffset-ULxng0E$foundation_release(TextFieldDelegate.kt:225)
at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$pointerModifier$1.invoke-k-4lQ0M(CoreTextField.kt:343)
at androidx.compose.foundation.text.CoreTextFieldKt$CoreTextField$pointerModifier$1.invoke(CoreTextField.kt:338)
at androidx.compose.foundation.text.TextFieldPressGestureFilterKt$tapPressTextFieldModifier$1$2$2.invoke-k-4lQ0M(TextFieldPressGestureFilter.kt:82)
at androidx.compose.foundation.text.TextFieldPressGestureFilterKt$tapPressTextFieldModifier$1$2$2.invoke(TextFieldPressGestureFilter.kt:55)
at androidx.compose.foundation.gestures.TapGestureDetectorKt$detectTapAndPress$2$1.invokeSuspend(TapGestureDetector.kt:255)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)