Saltar al contenido principal

Cambio en el orden de recorrido de accesibilidad del tooltip

El mensaje del widget Tooltip ahora sigue inmediatamente al hijo del widget Tooltip durante el recorrido de accesibilidad.

Resumen

#

Durante el recorrido del foco de accesibilidad, Tooltip.message se visita inmediatamente después de Tooltip.child.

Contexto

#

El widget Tooltip generalmente envuelve un componente de interfaz de usuario interactivo, como un botón, y muestra un mensaje de ayuda cuando se mantiene presionado. Cuando el mensaje es visible, las tecnologías de asistencia deben anunciarlo después del botón.

El widget Tooltip originalmente colocaba Tooltip.message en un OverlayEntry al mantenerlo presionado. Como resultado, Tooltip.message no estaba inmediatamente después de Tooltip.child en el árbol de semántica (semantics tree).

Guía de migración

#

Este cambio movió el mensaje del tooltip en el árbol de semántica. Podrías ver fallas en las pruebas de accesibilidad si tus pruebas esperan que aparezca un mensaje de tooltip en una ubicación específica en el árbol de semántica, cuando este sea visible. Actualiza cualquier prueba de accesibilidad fallida para adoptar el nuevo orden de semántica del tooltip.

Por ejemplo, si construiste el siguiente árbol de widgets en tu prueba:

dart
Directionality(
  textDirection: TextDirection.ltr,
  child: Overlay(
    initialEntries: <OverlayEntry>[
      OverlayEntry(
        builder: (BuildContext context) {
          return ListView(
            children: <Widget>[
              const Text('before'),
              Tooltip(
                key: tooltipKey,
                showDuration: const Duration(days: 365),
                message: 'message',
                child: const Text('child'),
              ),
              const Text('after'),
            ],
          );
        },
      ),
    ],
  ),
);

Cuando el mensaje del tooltip es visible, el árbol de semántica correspondiente antes de este cambio debería verse así:

dart
SemanticsNode#0
 
 SemanticsNode#1
  
  SemanticsNode#5
     flags: hasImplicitScrolling
     scrollChildren: 3
    
    SemanticsNode#2
       tags: RenderViewport.twoPane
       label: "before"
       textDirection: ltr
    
    SemanticsNode#3
       tags: RenderViewport.twoPane
       label: "child"
       tooltip: "message"
       textDirection: ltr
    
    SemanticsNode#4
        tags: RenderViewport.twoPane
        label: "after"
        textDirection: ltr
 
 SemanticsNode#6
     label: "message"
     textDirection: ltr

Después de este cambio, el mismo árbol de widgets genera un árbol de semántica ligeramente diferente, como se muestra a continuación. El nodo #6 se convierte en un hijo del nodo #3, en lugar del nodo #0.

dart
SemanticsNode#0
 
 SemanticsNode#1
   
   SemanticsNode#5
      flags: hasImplicitScrolling
      scrollChildren: 3
     
     SemanticsNode#2
        tags: RenderViewport.twoPane
        label: "before"
        textDirection: ltr
     
     SemanticsNode#3
       tags: RenderViewport.twoPane
       label: "child"
       tooltip: "message"
       textDirection: ltr
      
      SemanticsNode#6
          label: "message"
          textDirection: ltr
     
     SemanticsNode#4
         tags: RenderViewport.twoPane
         label: "after"
         textDirection: ltr

Timeline

#

Llegó en la versión: 3.16.0-11.0.pre
En la versión estable: 3.19.0

Referencias

#

Documentación de la API:

PRs relevantes: