Saltar al contenido principal

currentTextEditingValue de TextInputClient

Añadir un nuevo campo a la interfaz TextInputClient para obtener el TextEditingValue actual de un cliente.

Resumen

#

Añade un campo, currentTextEditingValue, a la interfaz TextInputClient interfaz para obtener el valor actual de un campo de texto editable desde un cliente de plataforma.

Contexto

#

La clase TextInputClient es utilizada por el framework de Flutter para comunicarse con el código de plataforma sobre el estado actual de los widgets de entrada de texto como EditableText.

El lado de la plataforma puede perder su estado cuando una aplicación de Android pasa a segundo plano. A partir de este cambio, la aplicación puede pedirle al framework el último estado conocido. Para obtener esta información, se expuso TextEditingValue para TextInputClient.

Descripción del cambio

#

En algunas plataformas soportadas, la aplicación se puede mover a segundo plano, donde se espera que consuma menos recursos. Por ejemplo, una aplicación en segundo plano en Android debería evitar consumir memoria innecesaria y no tiene necesidad de retener referencias a las vistas. Antes de este cambio, el código de plataforma específico de Android podía perder información de estado sobre los campos de texto editables cuando la aplicación volvía a primer plano. Esto se ve, por ejemplo, cuando el texto ingresado en un widget TextField se pierde en el código Java, pero aún se recuerda en el código Dart.

A partir de este cambio, el lado de la plataforma ahora envía un mensaje a través del canal textInput llamado TextInput.requestExistingState. Esto notifica al código Dart que, cuando la aplicación se active, debe restablecer cualquier conexión de entrada de texto y notificar a la plataforma su estado de edición más recientemente conocido.

La clase TextInput interactúa con los widgets cliente utilizando la interfaz TextInputClient. Esta interfaz anteriormente no proporcionaba información sobre el valor actual que tenía un cliente. Para permitir que la clase TextInput responda adecuadamente a TextInput.requestExistingState, se agregó un nuevo getter a TextInputClient llamado currentTextEditingValue. No puedes usar de forma segura el último valor pasado a TextInputConnection.setEditingState, ya que el cliente solo llama a ese método bajo circunstancias específicas, como cuando el código Dart modifica directamente el valor de un TextEditingController de una manera que no refleja directamente el manejo nativo de la plataforma para la respuesta a un evento de entrada de teclado. Así es como funciona generalmente un TextInputFormatter, o lo que sucede cuando el código Dart establece directamente TextEditingController.value.

Guía de migración

#

Si anteriormente implementaste o extendiste TextEditingClient, ahora debes agregar la invalidación adecuada para currentTextEditingValue.

Este valor puede ser nulo.

Si deseas migrar antes de que llegue este cambio, puedes agregar una clase a tu clase similar a la siguiente:

dart
abstract class _TemporaryTextEditingClient {
  TextEditingValue get currentTextEditingValue;
}

Esto te permite agregar el nuevo miembro con una anotación @override antes de que el cambio llegue al framework. Más tarde, puedes eliminar la definición de interfaz temporal.

Código antes de la migración:

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

Código después de la migración:

dart
class _MyCustomTextWidgetState extends State<MyCustomWidget> implements TextEditingClient {
  ...

  @override
  TextEditingValue get currentTextEditingValue => widget.textEditingController.value;

  @override
  void updateEditingValue(TextEditingValue value) {
    ...
  }

  @override
  void performAction(TextInputAction action) {
    ...
  }

  @override
  void updateFloatingCursor(RawFloatingCursorPoint point) {
    ...
  }
}

Timeline

#

Lanzado en la versión: 1.16.3
En versión estable: 1.17

Referencias

#

Documentación de la API:

Problema relevante:

PR relevante: