Commit c95e7341 authored by Adam Barth's avatar Adam Barth Committed by GitHub

Adds support for custom fonts for icons (#8880)

This update adds support for custom fonts in icons. As an example, it
can be used with the icon-set from https://materialdesignicons.com

Thanks to @vlidholt for the original patch.

Fixes #4494
Fixes #3199
parent 3e37b1ef
...@@ -114,7 +114,7 @@ class Icon extends StatelessWidget { ...@@ -114,7 +114,7 @@ class Icon extends StatelessWidget {
inherit: false, inherit: false,
color: iconColor, color: iconColor,
fontSize: iconSize, fontSize: iconSize,
fontFamily: 'MaterialIcons' fontFamily: icon.fontFamily
) )
) )
) )
......
...@@ -10,11 +10,16 @@ class IconData { ...@@ -10,11 +10,16 @@ class IconData {
/// ///
/// Rarely used directly. Instead, consider using one of the predefined icons /// Rarely used directly. Instead, consider using one of the predefined icons
/// from the [Icons] collection. /// from the [Icons] collection.
const IconData(this.codePoint); const IconData(this.codePoint, {
this.fontFamily: 'MaterialIcons'
});
/// The unicode code point at which this icon is stored in the icon font. /// The unicode code point at which this icon is stored in the icon font.
final int codePoint; final int codePoint;
/// The font family from which the glyph for the [codePoint] will be selected.
final String fontFamily;
@override @override
bool operator ==(dynamic other) { bool operator ==(dynamic other) {
if (other is! IconData) if (other is! IconData)
......
...@@ -11,8 +11,8 @@ void main() { ...@@ -11,8 +11,8 @@ void main() {
testWidgets('Icon sizing - no theme, default size', (WidgetTester tester) async { testWidgets('Icon sizing - no theme, default size', (WidgetTester tester) async {
await tester.pumpWidget( await tester.pumpWidget(
new Center( new Center(
child: const Icon(null) child: const Icon(null),
) ),
); );
final RenderBox renderObject = tester.renderObject(find.byType(Icon)); final RenderBox renderObject = tester.renderObject(find.byType(Icon));
...@@ -24,9 +24,9 @@ void main() { ...@@ -24,9 +24,9 @@ void main() {
new Center( new Center(
child: const Icon( child: const Icon(
null, null,
size: 96.0 size: 96.0,
) ),
) ),
); );
final RenderBox renderObject = tester.renderObject(find.byType(Icon)); final RenderBox renderObject = tester.renderObject(find.byType(Icon));
...@@ -38,9 +38,9 @@ void main() { ...@@ -38,9 +38,9 @@ void main() {
new Center( new Center(
child: new IconTheme( child: new IconTheme(
data: const IconThemeData(size: 36.0), data: const IconThemeData(size: 36.0),
child: const Icon(null) child: const Icon(null),
) ),
) ),
); );
final RenderBox renderObject = tester.renderObject(find.byType(Icon)); final RenderBox renderObject = tester.renderObject(find.byType(Icon));
...@@ -54,9 +54,9 @@ void main() { ...@@ -54,9 +54,9 @@ void main() {
data: const IconThemeData(size: 36.0), data: const IconThemeData(size: 36.0),
child: const Icon( child: const Icon(
null, null,
size: 48.0 size: 48.0,
) ),
) ),
) )
); );
...@@ -69,12 +69,24 @@ void main() { ...@@ -69,12 +69,24 @@ void main() {
new Center( new Center(
child: new IconTheme( child: new IconTheme(
data: const IconThemeData(), data: const IconThemeData(),
child: const Icon(null) child: const Icon(null),
) ),
) ),
); );
final RenderBox renderObject = tester.renderObject(find.byType(Icon)); final RenderBox renderObject = tester.renderObject(find.byType(Icon));
expect(renderObject.size, equals(const Size.square(24.0))); expect(renderObject.size, equals(const Size.square(24.0)));
}); });
testWidgets('Icon with custom font', (WidgetTester tester) async {
await tester.pumpWidget(
new Center(
child: const Icon(const IconData(0x41, fontFamily: 'Roboto')),
),
);
final RichText richText = tester.firstWidget(find.byType(RichText));
expect(richText.text.style.fontFamily, equals('Roboto'));
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment