From 57dd0de38cd565fe4c4518bfb7141f4754ac650f Mon Sep 17 00:00:00 2001 From: Mitchell Goodwin <58190796+MitchellGoodwin@users.noreply.github.com> Date: Fri, 16 May 2025 10:29:12 -0700 Subject: [PATCH] Resolve Cupertino textstyle in MaterialBasedCupertinoThemeData (#167597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #146864. The overridden resolve was keeping the Cupertino text styles from resolving their dynamic colors depending on the theme brightness when in a MaterialApp in most cases. I *believe* that this was to keep values from the Material theme from changing, but as far as I can tell that shouldn't affect anything in the current state and that is 6 year old code. Waiting to see if tests make me a liar. Update: tests made me a liar. Before (text should be showing): Screenshot 2025-04-22 at 1 58 53 PM After: Screenshot 2025-04-22 at 1 59 16 PM ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [x] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --- .../flutter/lib/src/material/theme_data.dart | 7 ++++-- .../flutter/test/material/theme_test.dart | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 8443784573f..d42d6989c50 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -3010,11 +3010,14 @@ class MaterialBasedCupertinoThemeData extends CupertinoThemeData { @override CupertinoThemeData resolveFrom(BuildContext context) { - // Only the cupertino override theme part will be resolved. + // Only the cupertino override theme part will be resolved, as well as the + // default text theme. // If the color comes from the material theme it's not resolved. + final NoDefaultCupertinoThemeData cupertinoOverrideThemeWithTextTheme = _cupertinoOverrideTheme + .copyWith(textTheme: textTheme); return MaterialBasedCupertinoThemeData._( _materialTheme, - _cupertinoOverrideTheme.resolveFrom(context), + cupertinoOverrideThemeWithTextTheme.resolveFrom(context), ); } } diff --git a/packages/flutter/test/material/theme_test.dart b/packages/flutter/test/material/theme_test.dart index ee9b9aeedd8..ac3d6b8d9f0 100644 --- a/packages/flutter/test/material/theme_test.dart +++ b/packages/flutter/test/material/theme_test.dart @@ -758,6 +758,30 @@ void main() { expect(CupertinoTheme.brightnessOf(context!), Brightness.light); }); + testWidgets('Cupertino widgets correctly get the right text theme in dark mode', ( + WidgetTester tester, + ) async { + final GlobalKey textFieldKey = GlobalKey(); + await tester.pumpWidget( + MaterialApp( + theme: ThemeData.dark(), + home: Scaffold(body: CupertinoTextField(key: textFieldKey)), + ), + ); + await tester.pumpAndSettle(); + + final EditableTextState state = tester.state(find.byType(EditableText)); + + // Default CupertinoTextStyle color is a CupertinoDynamicColor. + final CupertinoThemeData cupertinoThemeData = CupertinoTheme.of(textFieldKey.currentContext!); + expect(cupertinoThemeData.textTheme.textStyle.color, isA()); + final CupertinoDynamicColor themeTextStyleColor = + cupertinoThemeData.textTheme.textStyle.color! as CupertinoDynamicColor; + + // The value of the textfield's color should resolve to the theme's dark color. + expect(state.widget.style.color?.value, equals(themeTextStyleColor.darkColor.value)); + }); + testWidgets('Material2 - Can override material theme', (WidgetTester tester) async { final CupertinoThemeData themeM2 = await testTheme( tester,