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:
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í:
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.
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:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.