Fix AppBar web accessibility: prevent more items announcements
diff --git a/packages/flutter/lib/src/material/app_bar.dart b/packages/flutter/lib/src/material/app_bar.dart
index 6d8ac31..019cb42 100644
--- a/packages/flutter/lib/src/material/app_bar.dart
+++ b/packages/flutter/lib/src/material/app_bar.dart
@@ -1074,6 +1074,7 @@
             TargetPlatform.iOS || TargetPlatform.macOS => null,
           },
           header: true,
+          explicitChildNodes: !kIsWeb,
           child: title,
         );
       }
@@ -1196,12 +1197,12 @@
         children: <Widget>[
           Semantics(
             sortKey: widget.useDefaultSemanticsOrder ? const OrdinalSortKey(1.0) : null,
-            explicitChildNodes: true,
+            explicitChildNodes: !kIsWeb,
             child: widget.flexibleSpace,
           ),
           Semantics(
             sortKey: widget.useDefaultSemanticsOrder ? const OrdinalSortKey(0.0) : null,
-            explicitChildNodes: true,
+            explicitChildNodes: !kIsWeb,
             // Creates a material widget to prevent the flexibleSpace from
             // obscuring the ink splashes produced by appBar children.
             child: Material(type: MaterialType.transparency, child: appBar),
@@ -1240,7 +1241,10 @@
               (theme.useMaterial3 ? theme.colorScheme.surfaceTint : null),
           shape: widget.shape ?? appBarTheme.shape ?? defaults.shape,
           animateColor: widget.animateColor,
-          child: Semantics(explicitChildNodes: true, child: appBar),
+          child: Semantics(
+            explicitChildNodes: !kIsWeb,
+            child: appBar,
+          ),
         ),
       ),
     );
diff --git a/packages/flutter/test/material/app_bar_test.dart b/packages/flutter/test/material/app_bar_test.dart
index 386c7ea..479e0fa 100644
--- a/packages/flutter/test/material/app_bar_test.dart
+++ b/packages/flutter/test/material/app_bar_test.dart
@@ -1388,8 +1388,13 @@
                                     SemanticsFlag.isHeader,
                                     SemanticsFlag.namesRoute,
                                   ],
-                                  label: 'Title',
-                                  textDirection: TextDirection.ltr,
+                                  children: <TestSemantics>[
+                                    TestSemantics(
+                                      id: 10,
+                                      label: 'Title',
+                                      textDirection: TextDirection.ltr,
+                                    ),
+                                  ],
                                 ),
                               ],
                             ),
@@ -1474,8 +1479,13 @@
                                 SemanticsFlag.isHeader,
                                 SemanticsFlag.namesRoute,
                               ],
-                              label: 'Title',
-                              textDirection: TextDirection.ltr,
+                              children: <TestSemantics>[
+                                TestSemantics(
+                                  id: 8,
+                                  label: 'Title',
+                                  textDirection: TextDirection.ltr,
+                                ),
+                              ],
                             ),
                           ],
                         ),
@@ -3625,4 +3635,32 @@
       },
     );
   });
+
+  testWidgets('AppBar uses explicitChildNodes: !kIsWeb for web accessibility', (
+    WidgetTester tester,
+  ) async {
+    // Regression test for https://github.com/flutter/flutter/issues/176332
+    // AppBar wraps content with Semantics(explicitChildNodes: !kIsWeb) to prevent
+    // screen readers on web from announcing "X more items" when navigating.
+
+    final SemanticsTester semantics = SemanticsTester(tester);
+
+    await tester.pumpWidget(
+      MaterialApp(
+        home: Scaffold(
+          appBar: AppBar(leading: const BackButton(), title: const Text('Book Details')),
+        ),
+      ),
+    );
+
+    // The fix creates a parent-child structure where the title's text is in a
+    // child node and the parent has the isHeader flag (explicitChildNodes: true).
+    final SemanticsNode titleNode = tester.getSemantics(find.text('Book Details'));
+    final SemanticsNode? parent = titleNode.parent;
+
+    expect(parent, isNotNull);
+    expect(parent!.hasFlag(SemanticsFlag.isHeader), isTrue);
+
+    semantics.dispose();
+  });
 }