Skip to content

Commit 57dd0de

Browse files
Resolve Cupertino textstyle in MaterialBasedCupertinoThemeData (flutter#167597)
Fixes flutter#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): <img width="423" alt="Screenshot 2025-04-22 at 1 58 53 PM" src="https://github.com/user-attachments/assets/0aabf6cf-2c25-4446-8d12-69e745f26be0" /> After: <img width="418" alt="Screenshot 2025-04-22 at 1 59 16 PM" src="https://github.com/user-attachments/assets/ea9958bb-4470-4f16-b5ca-f149be1301b1" /> ## 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]. <!-- Links --> [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
1 parent 8ae7b52 commit 57dd0de

2 files changed

Lines changed: 29 additions & 2 deletions

File tree

packages/flutter/lib/src/material/theme_data.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3010,11 +3010,14 @@ class MaterialBasedCupertinoThemeData extends CupertinoThemeData {
30103010

30113011
@override
30123012
CupertinoThemeData resolveFrom(BuildContext context) {
3013-
// Only the cupertino override theme part will be resolved.
3013+
// Only the cupertino override theme part will be resolved, as well as the
3014+
// default text theme.
30143015
// If the color comes from the material theme it's not resolved.
3016+
final NoDefaultCupertinoThemeData cupertinoOverrideThemeWithTextTheme = _cupertinoOverrideTheme
3017+
.copyWith(textTheme: textTheme);
30153018
return MaterialBasedCupertinoThemeData._(
30163019
_materialTheme,
3017-
_cupertinoOverrideTheme.resolveFrom(context),
3020+
cupertinoOverrideThemeWithTextTheme.resolveFrom(context),
30183021
);
30193022
}
30203023
}

packages/flutter/test/material/theme_test.dart

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,30 @@ void main() {
758758
expect(CupertinoTheme.brightnessOf(context!), Brightness.light);
759759
});
760760

761+
testWidgets('Cupertino widgets correctly get the right text theme in dark mode', (
762+
WidgetTester tester,
763+
) async {
764+
final GlobalKey textFieldKey = GlobalKey();
765+
await tester.pumpWidget(
766+
MaterialApp(
767+
theme: ThemeData.dark(),
768+
home: Scaffold(body: CupertinoTextField(key: textFieldKey)),
769+
),
770+
);
771+
await tester.pumpAndSettle();
772+
773+
final EditableTextState state = tester.state<EditableTextState>(find.byType(EditableText));
774+
775+
// Default CupertinoTextStyle color is a CupertinoDynamicColor.
776+
final CupertinoThemeData cupertinoThemeData = CupertinoTheme.of(textFieldKey.currentContext!);
777+
expect(cupertinoThemeData.textTheme.textStyle.color, isA<CupertinoDynamicColor>());
778+
final CupertinoDynamicColor themeTextStyleColor =
779+
cupertinoThemeData.textTheme.textStyle.color! as CupertinoDynamicColor;
780+
781+
// The value of the textfield's color should resolve to the theme's dark color.
782+
expect(state.widget.style.color?.value, equals(themeTextStyleColor.darkColor.value));
783+
});
784+
761785
testWidgets('Material2 - Can override material theme', (WidgetTester tester) async {
762786
final CupertinoThemeData themeM2 = await testTheme(
763787
tester,

0 commit comments

Comments
 (0)