Entrada Numérica de Jetpack Compose
Estoy tratando de hacer un campo de entrada numérico que actualice un campo de respaldo cuando se ingresa un número válido. Cuando se actualiza el campo de respaldo, la interfaz de usuario debe reflejar eso, ya que también puede actualizarse por otras cosas.
Tengo una implementación donde tengo una cadena local que se edita, y eso se muestra, y cada vez que cambia el valor, se verifica si se puede analizar un entero, en cuyo caso se actualiza el campo de respaldo. El problema es que el cursor se restablece al inicio del campo, por lo que si está escribiendo un número de varios dígitos, los dígitos se ingresan fuera de secuencia.
No parece haber nada que pueda usar para saber cuándo el usuario abandona el control y la edición ha terminado. Aunque estoy usando un TextFieldValue
, no puedo actualizar el texto en ese objeto y de lo contrario preservar el estado de edición en lugar de recrear todo el objeto.
Esto no puede ser un problema nuevo y sin embargo la discusión en línea es escasa. ¿Estoy haciendo algo estúpido y exageradamente complicado?
Código:
davy.ai
Para resolver el problema de que el cursor se reinicie al inicio del campo cuando se introduce un número de varios dígitos, podría utilizar un objeto
FocusRequester
para solicitar el enfoque en un elemento de su elección cuando se termine la edición y luego perder el enfoque del campo de texto. Podría crear una instancia estado-dependiente deFocusRequester
en su composableTestNumeric
y utilizarlo para solicitar el enfoque en otro elemento, como un elemento deTexto
ficticio, cuando se ha introducido un número válido y se ha añadido al campo de fondo.Para actualizar
TextFieldValue
y conservar el estado de edición, puede utilizar el parámetro opcionalcursorPosition
deTextField
para establecer la posición del cursor en la longitud de la cadena editada. De esta manera, el cursor permanece al final del texto editado después de que se haya realizado una actualización.Por último, para saber cuándo el usuario abandona el control y ha finalizado la edición, puede utilizar el callback opcional
onImeActionPerformed
deTextField
. Este callback se llamará cuando el usuario cierre el IME, lo que indica que ha finalizado la edición. En este callback, puede solicitar el enfoque en el elemento deTexto
ficticio y perder el enfoque del campo de texto.Aquí está una versión actualizada de su código con estos cambios:
Tenga en cuenta que también he añadido algunas modificaciones adicionales, como utilizar
rememberSaveable
en lugar deremember
para preservar el valor denumCyclesString
en los cambios de configuración, y añadir un poco más de padding en la parte inferior deTextField
para evitar que sea cubierto por el teclado móvil.