diff --git a/packages/flutter/lib/src/material/app.dart b/packages/flutter/lib/src/material/app.dart index 96f7641c6a..b1f5db5df1 100644 --- a/packages/flutter/lib/src/material/app.dart +++ b/packages/flutter/lib/src/material/app.dart @@ -655,11 +655,11 @@ class _MaterialAppState extends State { final bool highContrast = MediaQuery.highContrastOf(context); ThemeData theme; - if (useDarkTheme && highContrast) { + if (useDarkTheme && highContrast && widget.highContrastDarkTheme != null) { theme = widget.highContrastDarkTheme; - } else if (useDarkTheme) { + } else if (useDarkTheme && widget.darkTheme != null) { theme = widget.darkTheme; - } else if (highContrast) { + } else if (highContrast && widget.highContrastTheme != null) { theme = widget.highContrastTheme; } theme ??= widget.theme ?? ThemeData.light(); diff --git a/packages/flutter/test/material/app_test.dart b/packages/flutter/test/material/app_test.dart index 7a1ac44dd1..afbe731cf7 100644 --- a/packages/flutter/test/material/app_test.dart +++ b/packages/flutter/test/material/app_test.dart @@ -812,6 +812,34 @@ void main() { tester.binding.window.accessibilityFeaturesTestValue = null; }); + testWidgets('MaterialApp uses dark theme when no high contrast dark theme is provided', (WidgetTester tester) async { + tester.binding.window.platformBrightnessTestValue = Brightness.dark; + tester.binding.window.accessibilityFeaturesTestValue = MockAccessibilityFeature(); + + ThemeData appliedTheme; + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + primaryColor: Colors.lightBlue, + ), + darkTheme: ThemeData( + primaryColor: Colors.lightGreen, + ), + home: Builder( + builder: (BuildContext context) { + appliedTheme = Theme.of(context); + return const SizedBox(); + }, + ), + ), + ); + + expect(appliedTheme.primaryColor, Colors.lightGreen); + tester.binding.window.accessibilityFeaturesTestValue = null; + tester.binding.window.platformBrightnessTestValue = null; + }); + testWidgets('MaterialApp switches themes when the Window platformBrightness changes.', (WidgetTester tester) async { // Mock the Window to explicitly report a light platformBrightness. final TestWidgetsFlutterBinding binding = tester.binding;