From 4befa371663991c2c2bd5d0f39cc7b9ff1721c87 Mon Sep 17 00:00:00 2001 From: Victor Sanni Date: Tue, 19 Aug 2025 15:31:18 -0700 Subject: [PATCH] NavigationRail correct traversal order (#173891) Fix [[VPAT] [A11y] Navigation Rail has unexpected semantics traversal order](https://github.com/flutter/flutter/issues/172992) --- .../lib/src/material/navigation_rail.dart | 43 ++++++++++--------- .../test/material/navigation_rail_test.dart | 2 +- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/packages/flutter/lib/src/material/navigation_rail.dart b/packages/flutter/lib/src/material/navigation_rail.dart index 99189ad6f3d..c27e6b7d797 100644 --- a/packages/flutter/lib/src/material/navigation_rail.dart +++ b/packages/flutter/lib/src/material/navigation_rail.dart @@ -524,28 +524,31 @@ class _NavigationRailState extends State with TickerProviderStat mainGroup = SingleChildScrollView(child: mainGroup); } - return _ExtendedNavigationRailAnimation( - animation: _extendedAnimation, - child: Semantics( - explicitChildNodes: true, - child: Material( - elevation: elevation, - color: backgroundColor, - child: SafeArea( - right: isRTLDirection, - left: !isRTLDirection, - child: Column( - children: [ - _verticalSpacer, - if (widget.leadingAtTop && widget.leading != null) ...[ - widget.leading!, + return Semantics( + container: true, + child: _ExtendedNavigationRailAnimation( + animation: _extendedAnimation, + child: Semantics( + explicitChildNodes: true, + child: Material( + elevation: elevation, + color: backgroundColor, + child: SafeArea( + right: isRTLDirection, + left: !isRTLDirection, + child: Column( + children: [ _verticalSpacer, + if (widget.leadingAtTop && widget.leading != null) ...[ + widget.leading!, + _verticalSpacer, + ], + Flexible( + child: Align(alignment: Alignment(0, groupAlignment), child: mainGroup), + ), + if (widget.trailingAtBottom && widget.trailing != null) widget.trailing!, ], - Flexible( - child: Align(alignment: Alignment(0, groupAlignment), child: mainGroup), - ), - if (widget.trailingAtBottom && widget.trailing != null) widget.trailing!, - ], + ), ), ), ), diff --git a/packages/flutter/test/material/navigation_rail_test.dart b/packages/flutter/test/material/navigation_rail_test.dart index 41d49dafe5f..84058931d83 100644 --- a/packages/flutter/test/material/navigation_rail_test.dart +++ b/packages/flutter/test/material/navigation_rail_test.dart @@ -6201,7 +6201,7 @@ TestSemantics _expectedSemantics({bool scrollable = false}) { TestSemantics( flags: [SemanticsFlag.scopesRoute], children: [ - ...destinations, + TestSemantics(children: destinations), TestSemantics(label: 'body', textDirection: TextDirection.ltr), ], ),