diff --git a/packages/flutter/lib/src/material/drawer.dart b/packages/flutter/lib/src/material/drawer.dart index 8a8b0dc7a1f..ef91e954264 100644 --- a/packages/flutter/lib/src/material/drawer.dart +++ b/packages/flutter/lib/src/material/drawer.dart @@ -14,6 +14,7 @@ /// @docImport 'scaffold.dart'; library; +import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart' show DragStartBehavior; import 'package:flutter/widgets.dart'; @@ -250,7 +251,7 @@ class Drawer extends StatelessWidget { assert(debugCheckHasMaterialLocalizations(context)); final DrawerThemeData drawerTheme = DrawerTheme.of(context); String? label = semanticLabel; - switch (Theme.of(context).platform) { + switch (defaultTargetPlatform) { case TargetPlatform.iOS: case TargetPlatform.macOS: break; @@ -685,7 +686,7 @@ class DrawerControllerState extends State with SingleTickerPro } } else { final bool platformHasBackButton; - switch (Theme.of(context).platform) { + switch (defaultTargetPlatform) { case TargetPlatform.android: platformHasBackButton = true; case TargetPlatform.iOS: diff --git a/packages/flutter/test/material/drawer_test.dart b/packages/flutter/test/material/drawer_test.dart index 81a559e399c..8d77883aa6d 100644 --- a/packages/flutter/test/material/drawer_test.dart +++ b/packages/flutter/test/material/drawer_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; @@ -969,6 +970,69 @@ void main() { }, ); + // Regression test for https://github.com/flutter/flutter/issues/177005 + testWidgets('Drawer semantics for mismatched platforms', (WidgetTester tester) async { + const DefaultMaterialLocalizations localizations = DefaultMaterialLocalizations(); + + Future pumpDrawerWithTheme(TargetPlatform themePlatform) async { + final GlobalKey scaffoldKey = GlobalKey(); + await tester.pumpWidget( + MaterialApp( + theme: ThemeData(platform: themePlatform), + home: Scaffold( + key: scaffoldKey, + drawer: const Drawer(child: Text('Drawer')), + body: Container(), + ), + ), + ); + + scaffoldKey.currentState!.openDrawer(); + await tester.pumpAndSettle(); + + // Test label semantics. + final Finder drawerLabelFinder = find.bySemanticsLabel(localizations.drawerLabel); + if (defaultTargetPlatform == TargetPlatform.iOS || + defaultTargetPlatform == TargetPlatform.macOS) { + expect(drawerLabelFinder, findsNothing); // Apple platforms don't show drawer label. + } else { + expect(drawerLabelFinder, findsOneWidget); // Non-Apple platforms show drawer label. + } + + // Test barrier semantics. + final SemanticsTester semantics = SemanticsTester(tester); + final bool expectBarrierExcluded = defaultTargetPlatform == TargetPlatform.android; + + if (expectBarrierExcluded) { + expect( + semantics, + isNot( + includesNodeWith( + label: localizations.modalBarrierDismissLabel, + actions: [SemanticsAction.tap, SemanticsAction.focus], + ), + ), + ); + } else { + expect( + semantics, + includesNodeWith( + label: localizations.modalBarrierDismissLabel, + actions: [SemanticsAction.tap], + ), + ); + } + + semantics.dispose(); + } + + // Test with theme.platform = Android on different real platforms. + await pumpDrawerWithTheme(TargetPlatform.android); + + // Test with theme.platform = iOS on different real platforms. + await pumpDrawerWithTheme(TargetPlatform.iOS); + }, variant: TargetPlatformVariant.all()); + group('Material 2', () { // These tests are only relevant for Material 2. Once Material 2 // support is deprecated and the APIs are removed, these tests