From 114f05cef633efc5a0cc732e88cc409477bd3e7d Mon Sep 17 00:00:00 2001 From: Vasiliy Ditsyak Date: Thu, 1 Jun 2023 17:43:18 +0200 Subject: [PATCH] Add fallback font to IconData class (#127269) This PR adds an ability to specify `fallbackFont` for `Icon` class via `IconData` props. Read detailed description here https://github.com/flutter/flutter/issues/126670 --- packages/flutter/lib/src/widgets/icon.dart | 1 + .../flutter/lib/src/widgets/icon_data.dart | 19 +++++++++++++++++-- packages/flutter/test/widgets/icon_test.dart | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/widgets/icon.dart b/packages/flutter/lib/src/widgets/icon.dart index 8210128f5ff..88edcaacb63 100644 --- a/packages/flutter/lib/src/widgets/icon.dart +++ b/packages/flutter/lib/src/widgets/icon.dart @@ -280,6 +280,7 @@ class Icon extends StatelessWidget { fontSize: iconSize, fontFamily: icon!.fontFamily, package: icon!.fontPackage, + fontFamilyFallback: icon!.fontFamilyFallback, shadows: iconShadows, ), ), diff --git a/packages/flutter/lib/src/widgets/icon_data.dart b/packages/flutter/lib/src/widgets/icon_data.dart index 7cca8d563ff..214cadcfc5e 100644 --- a/packages/flutter/lib/src/widgets/icon_data.dart +++ b/packages/flutter/lib/src/widgets/icon_data.dart @@ -31,6 +31,7 @@ class IconData { this.fontFamily, this.fontPackage, this.matchTextDirection = false, + this.fontFamilyFallback, }); /// The Unicode code point at which this icon is stored in the icon font. @@ -56,6 +57,11 @@ class IconData { /// [Directionality] is [TextDirection.rtl]. final bool matchTextDirection; + /// The ordered list of font families to fall back on when a glyph cannot be found in a higher priority font family. + /// + /// For more details, refer to the documentation of [TextStyle] + final List? fontFamilyFallback; + @override bool operator ==(Object other) { if (other.runtimeType != runtimeType) { @@ -65,11 +71,20 @@ class IconData { && other.codePoint == codePoint && other.fontFamily == fontFamily && other.fontPackage == fontPackage - && other.matchTextDirection == matchTextDirection; + && other.matchTextDirection == matchTextDirection + && listEquals(other.fontFamilyFallback, fontFamilyFallback); } @override - int get hashCode => Object.hash(codePoint, fontFamily, fontPackage, matchTextDirection); + int get hashCode { + return Object.hash( + codePoint, + fontFamily, + fontPackage, + matchTextDirection, + Object.hashAll(fontFamilyFallback ?? const []), + ); + } @override String toString() => 'IconData(U+${codePoint.toRadixString(16).toUpperCase().padLeft(5, '0')})'; diff --git a/packages/flutter/test/widgets/icon_test.dart b/packages/flutter/test/widgets/icon_test.dart index 93cb51147d7..4b53d670a33 100644 --- a/packages/flutter/test/widgets/icon_test.dart +++ b/packages/flutter/test/widgets/icon_test.dart @@ -127,6 +127,20 @@ void main() { expect(richText.text.style!.fontFamily, equals('Roboto')); }); + testWidgets('Icon with custom fontFamilyFallback', (WidgetTester tester) async { + await tester.pumpWidget( + const Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Icon(IconData(0x41, fontFamilyFallback: ['FallbackFont'])), + ), + ), + ); + + final RichText richText = tester.firstWidget(find.byType(RichText)); + expect(richText.text.style!.fontFamilyFallback, equals(['FallbackFont'])); + }); + testWidgets('Icon with semantic label', (WidgetTester tester) async { final SemanticsTester semantics = SemanticsTester(tester);