Saltar al contenido principal

SystemContextMenuController.show Deprecado

El método `show` de `SystemContextMenuController` está deprecado y ha sido reemplazado por su método `showWithItems`.

Resumen

#

SystemContextMenuController.show está deprecado. La misma funcionalidad se puede lograr pasando el resultado de llamar a SystemContextMenu.getDefaultItems a SystemContextMenuController.showWithItems.

Contexto

#

La característica de SystemContextMenu dibujado por iOS originalmente se añadió sin la capacidad de controlar qué elementos se muestran en el menú. La plataforma decidía qué elementos mostrar en función de la TextInputConnection activa.

El problema con este enfoque es que a menudo se muestra un botón "Autofill" (Autocompletar), pero Flutter no tiene la capacidad de responder a este botón. Por lo tanto, en muchos casos, los usuarios ven un botón "Autofill" que no hace nada cuando se pulsa, y los desarrolladores de aplicaciones de Flutter no tienen forma de ocultar el botón.

Este problema se resuelve introduciendo un nuevo método, SystemContextMenuController.showWithItems, que requiere pasar una lista de elementos (items).

Los desarrolladores que no tengan preferencia sobre qué elementos se muestran pueden llamar al nuevo método SystemContextMenu.getDefaultItems para obtener los elementos predeterminados según el EditableTextState proporcionado. Por ejemplo, si el EditableTextState indica que no hay nada seleccionado, entonces el botón Copy (Copiar) no se incluirá, ya que requiere una selección para copiar.

Guía de migración

#

La mayoría de los usuarios utilizan el menú de contexto del sistema a través del widget SystemContextMenu, y en este caso no se requerirá ningún cambio. El widget SystemContextMenu obtiene automáticamente los elementos predeterminados internamente.

No se requiere migración:

dart
class _MyWidgetState extends State<MyWidget> {
  @override
  Widget build(BuildContext context) {
    TextField(
      contextMenuBuilder: (BuildContext context, EditableTextState editableTextState) {
        return SystemContextMenu.editableText(
          editableTextState: editableTextState,
        );
      }
    );
  }
}

Para los usuarios avanzados que trabajan directamente con SystemContextMenuController, migren al nuevo método SystemContextMenuController.showWithItems. El comportamiento predeterminado se puede obtener de SystemContextMenu.getDefaultItems como una lista de IOSSystemContextMenuItems, que se puede convertir al formato requerido por showWithItems mediante IOSSystemContextMenuItem.getData.

Código antes de la migración:

dart
_controller.show(selectionRect);

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

dart
final List<IOSSystemContextMenuItem> defaultItems =
    SystemContextMenu.getDefaultItems(editableTextState);
final WidgetsLocalizations localizations =
    WidgetsLocalizations.of(context);
final List<IOSSystemContextMenuItemData> defaultItemData =
    defaultItems
        .map((IOSSystemContextMenuItem item) =>
            item.getData(localizations))
        .toList();
_controller.showWithItems(selectionRect, defaultItemData);

Timeline

#

Llegó en la versión: 3.29.0-0.3.pre
En la versión estable: 3.32

Referencias

#

Documentación de la API:

Issues relevantes:

PRs relevantes: