Skip to content

Commit 4c6251a

Browse files
authored
Add fontFamilyFallback to ThemeData (#112976)
Add missing parameters to ThemeData (fontFamilyFallback and package)
1 parent 025a3ab commit 4c6251a

File tree

4 files changed

+80
-0
lines changed

4 files changed

+80
-0
lines changed

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

+32
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,8 @@ class TextTheme with Diagnosticable {
616616
/// point.
617617
TextTheme apply({
618618
String? fontFamily,
619+
List<String>? fontFamilyFallback,
620+
String? package,
619621
double fontSizeFactor = 1.0,
620622
double fontSizeDelta = 0.0,
621623
Color? displayColor,
@@ -631,134 +633,164 @@ class TextTheme with Diagnosticable {
631633
decorationColor: decorationColor,
632634
decorationStyle: decorationStyle,
633635
fontFamily: fontFamily,
636+
fontFamilyFallback: fontFamilyFallback,
634637
fontSizeFactor: fontSizeFactor,
635638
fontSizeDelta: fontSizeDelta,
639+
package: package,
636640
),
637641
displayMedium: displayMedium?.apply(
638642
color: displayColor,
639643
decoration: decoration,
640644
decorationColor: decorationColor,
641645
decorationStyle: decorationStyle,
642646
fontFamily: fontFamily,
647+
fontFamilyFallback: fontFamilyFallback,
643648
fontSizeFactor: fontSizeFactor,
644649
fontSizeDelta: fontSizeDelta,
650+
package: package,
645651
),
646652
displaySmall: displaySmall?.apply(
647653
color: displayColor,
648654
decoration: decoration,
649655
decorationColor: decorationColor,
650656
decorationStyle: decorationStyle,
651657
fontFamily: fontFamily,
658+
fontFamilyFallback: fontFamilyFallback,
652659
fontSizeFactor: fontSizeFactor,
653660
fontSizeDelta: fontSizeDelta,
661+
package: package,
654662
),
655663
headlineLarge: headlineLarge?.apply(
656664
color: displayColor,
657665
decoration: decoration,
658666
decorationColor: decorationColor,
659667
decorationStyle: decorationStyle,
660668
fontFamily: fontFamily,
669+
fontFamilyFallback: fontFamilyFallback,
661670
fontSizeFactor: fontSizeFactor,
662671
fontSizeDelta: fontSizeDelta,
672+
package: package,
663673
),
664674
headlineMedium: headlineMedium?.apply(
665675
color: displayColor,
666676
decoration: decoration,
667677
decorationColor: decorationColor,
668678
decorationStyle: decorationStyle,
669679
fontFamily: fontFamily,
680+
fontFamilyFallback: fontFamilyFallback,
670681
fontSizeFactor: fontSizeFactor,
671682
fontSizeDelta: fontSizeDelta,
683+
package: package,
672684
),
673685
headlineSmall: headlineSmall?.apply(
674686
color: bodyColor,
675687
decoration: decoration,
676688
decorationColor: decorationColor,
677689
decorationStyle: decorationStyle,
678690
fontFamily: fontFamily,
691+
fontFamilyFallback: fontFamilyFallback,
679692
fontSizeFactor: fontSizeFactor,
680693
fontSizeDelta: fontSizeDelta,
694+
package: package,
681695
),
682696
titleLarge: titleLarge?.apply(
683697
color: bodyColor,
684698
decoration: decoration,
685699
decorationColor: decorationColor,
686700
decorationStyle: decorationStyle,
687701
fontFamily: fontFamily,
702+
fontFamilyFallback: fontFamilyFallback,
688703
fontSizeFactor: fontSizeFactor,
689704
fontSizeDelta: fontSizeDelta,
705+
package: package,
690706
),
691707
titleMedium: titleMedium?.apply(
692708
color: bodyColor,
693709
decoration: decoration,
694710
decorationColor: decorationColor,
695711
decorationStyle: decorationStyle,
696712
fontFamily: fontFamily,
713+
fontFamilyFallback: fontFamilyFallback,
697714
fontSizeFactor: fontSizeFactor,
698715
fontSizeDelta: fontSizeDelta,
716+
package: package,
699717
),
700718
titleSmall: titleSmall?.apply(
701719
color: bodyColor,
702720
decoration: decoration,
703721
decorationColor: decorationColor,
704722
decorationStyle: decorationStyle,
705723
fontFamily: fontFamily,
724+
fontFamilyFallback: fontFamilyFallback,
706725
fontSizeFactor: fontSizeFactor,
707726
fontSizeDelta: fontSizeDelta,
727+
package: package,
708728
),
709729
bodyLarge: bodyLarge?.apply(
710730
color: bodyColor,
711731
decoration: decoration,
712732
decorationColor: decorationColor,
713733
decorationStyle: decorationStyle,
714734
fontFamily: fontFamily,
735+
fontFamilyFallback: fontFamilyFallback,
715736
fontSizeFactor: fontSizeFactor,
716737
fontSizeDelta: fontSizeDelta,
738+
package: package,
717739
),
718740
bodyMedium: bodyMedium?.apply(
719741
color: bodyColor,
720742
decoration: decoration,
721743
decorationColor: decorationColor,
722744
decorationStyle: decorationStyle,
723745
fontFamily: fontFamily,
746+
fontFamilyFallback: fontFamilyFallback,
724747
fontSizeFactor: fontSizeFactor,
725748
fontSizeDelta: fontSizeDelta,
749+
package: package,
726750
),
727751
bodySmall: bodySmall?.apply(
728752
color: displayColor,
729753
decoration: decoration,
730754
decorationColor: decorationColor,
731755
decorationStyle: decorationStyle,
732756
fontFamily: fontFamily,
757+
fontFamilyFallback: fontFamilyFallback,
733758
fontSizeFactor: fontSizeFactor,
734759
fontSizeDelta: fontSizeDelta,
760+
package: package,
735761
),
736762
labelLarge: labelLarge?.apply(
737763
color: bodyColor,
738764
decoration: decoration,
739765
decorationColor: decorationColor,
740766
decorationStyle: decorationStyle,
741767
fontFamily: fontFamily,
768+
fontFamilyFallback: fontFamilyFallback,
742769
fontSizeFactor: fontSizeFactor,
743770
fontSizeDelta: fontSizeDelta,
771+
package: package,
744772
),
745773
labelMedium: labelMedium?.apply(
746774
color: bodyColor,
747775
decoration: decoration,
748776
decorationColor: decorationColor,
749777
decorationStyle: decorationStyle,
750778
fontFamily: fontFamily,
779+
fontFamilyFallback: fontFamilyFallback,
751780
fontSizeFactor: fontSizeFactor,
752781
fontSizeDelta: fontSizeDelta,
782+
package: package,
753783
),
754784
labelSmall: labelSmall?.apply(
755785
color: bodyColor,
756786
decoration: decoration,
757787
decorationColor: decorationColor,
758788
decorationStyle: decorationStyle,
759789
fontFamily: fontFamily,
790+
fontFamilyFallback: fontFamilyFallback,
760791
fontSizeFactor: fontSizeFactor,
761792
fontSizeDelta: fontSizeDelta,
793+
package: package,
762794
),
763795
);
764796
}

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

+12
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ class ThemeData with Diagnosticable {
322322
Color? unselectedWidgetColor,
323323
// TYPOGRAPHY & ICONOGRAPHY
324324
String? fontFamily,
325+
List<String>? fontFamilyFallback,
326+
String? package,
325327
IconThemeData? iconTheme,
326328
IconThemeData? primaryIconTheme,
327329
TextTheme? primaryTextTheme,
@@ -561,6 +563,16 @@ class ThemeData with Diagnosticable {
561563
defaultPrimaryTextTheme = defaultPrimaryTextTheme.apply(fontFamily: fontFamily);
562564
defaultAccentTextTheme = defaultAccentTextTheme.apply(fontFamily: fontFamily);
563565
}
566+
if (fontFamilyFallback != null) {
567+
defaultTextTheme = defaultTextTheme.apply(fontFamilyFallback: fontFamilyFallback);
568+
defaultPrimaryTextTheme = defaultPrimaryTextTheme.apply(fontFamilyFallback: fontFamilyFallback);
569+
defaultAccentTextTheme = defaultAccentTextTheme.apply(fontFamilyFallback: fontFamilyFallback);
570+
}
571+
if (package != null) {
572+
defaultTextTheme = defaultTextTheme.apply(package: package);
573+
defaultPrimaryTextTheme = defaultPrimaryTextTheme.apply(package: package);
574+
defaultAccentTextTheme = defaultAccentTextTheme.apply(package: package);
575+
}
564576
textTheme = defaultTextTheme.merge(textTheme);
565577
primaryTextTheme = defaultPrimaryTextTheme.merge(primaryTextTheme);
566578
iconTheme ??= isDark ? const IconThemeData(color: kDefaultIconLightColor) : const IconThemeData(color: kDefaultIconDarkColor);

packages/flutter/test/material/text_theme_test.dart

+3
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ void main() {
7979
const Color displayColor = Color(0x00000001);
8080
const Color bodyColor = Color(0x00000002);
8181
const String fontFamily = 'fontFamily';
82+
const List<String> fontFamilyFallback = <String>['font', 'family', 'fallback'];
8283
const Color decorationColor = Color(0x00000003);
8384
const TextDecorationStyle decorationStyle = TextDecorationStyle.dashed;
8485
final TextDecoration decoration = TextDecoration.combine(<TextDecoration>[
@@ -89,6 +90,7 @@ void main() {
8990
final Typography typography = Typography.material2018();
9091
final TextTheme theme = typography.black.apply(
9192
fontFamily: fontFamily,
93+
fontFamilyFallback: fontFamilyFallback,
9294
displayColor: displayColor,
9395
bodyColor: bodyColor,
9496
decoration: decoration,
@@ -130,6 +132,7 @@ void main() {
130132
theme.labelSmall!,
131133
];
132134
expect(themeStyles.every((TextStyle style) => style.fontFamily == fontFamily), true);
135+
expect(themeStyles.every((TextStyle style) => style.fontFamilyFallback == fontFamilyFallback), true);
133136
expect(themeStyles.every((TextStyle style) => style.decorationColor == decorationColor), true);
134137
expect(themeStyles.every((TextStyle style) => style.decorationStyle == decorationStyle), true);
135138
expect(themeStyles.every((TextStyle style) => style.decoration == decoration), true);

packages/flutter/test/widgets/text_test.dart

+33
Original file line numberDiff line numberDiff line change
@@ -865,6 +865,39 @@ void main() {
865865
semantics.dispose();
866866
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/62945
867867

868+
testWidgets('receives fontFamilyFallback and package from root ThemeData', (WidgetTester tester) async {
869+
const String fontFamily = 'fontFamily';
870+
const String package = 'package_name';
871+
final List<String> fontFamilyFallback = <String>['font', 'family', 'fallback'];
872+
await tester.pumpWidget(
873+
MaterialApp(
874+
theme: ThemeData(
875+
fontFamily: fontFamily,
876+
fontFamilyFallback: fontFamilyFallback,
877+
package: package,
878+
primarySwatch: Colors.blue,
879+
),
880+
home: const Scaffold(
881+
body: Center(
882+
child: Text(
883+
'foo',
884+
),
885+
),
886+
),
887+
),
888+
);
889+
890+
expect(find.byType(RichText), findsOneWidget);
891+
final RichText richText = tester.widget(find.byType(RichText));
892+
final InlineSpan text = richText.text;
893+
final TextStyle? style = text.style;
894+
expect(style?.fontFamily, equals('packages/$package/$fontFamily'));
895+
for (int i = 0; i < fontFamilyFallback.length; i++) {
896+
final String fallback = fontFamilyFallback[i];
897+
expect(style?.fontFamilyFallback?[i], equals('packages/$package/$fallback'));
898+
}
899+
});
900+
868901
testWidgets('Overflow is clipping correctly - short text with overflow: clip', (WidgetTester tester) async {
869902
await _pumpTextWidget(
870903
tester: tester,

0 commit comments

Comments
 (0)