Material Symbols Icons for Flutter
Using Official Material Symbols Icons variable fonts version 2.799 released 11/15/2024 from material font repo with 3774 icons.
The dart docs and vscode hover docs now include icon preview (if you install the three MaterialSymbols*.ttf fonts locally on your machine).
Complete interactive icon map can be found here.
(with full variation support and automatic code generation capability for updating icon definition files)
This package is intended to be COMPLETELY compatible with the future flutter 'native' implementation of Material Symbols Icons support as defined in this specification document. Once flutter natively supports the Material Symbols icons all that should be needed is removal of the import statement for this package.
Icons are referenced using the Symbols class and the name of the desired icon. For Example Symbols.pedal_bike
, or you can access
the rounded version using Symbols.pedal_bike_rounded
and the sharp version using Symbols.pedal_bike_sharp
.
These icons also support the complete set of icon variation parameters defined for the Material Symbols Icons. This includes setting fill/not filled, various weights, grades and optical sizes.
Live Flutter Web Example with Material Symbols Icons style and variation customization
Here is a live example of the current version of this package where you can test any Material Symbols icon name to verify it's availability. The example also allows playing with all of the font variation options to explore further customizing the look of our Material Symbols.
To use this package simply
import 'package:material_symbols_icons/symbols.dart';
final myIcon = Icon( Symbols.add_task);
final myRoundedIcon = Icon( Symbols.add_task_rounded);
final mySharpIcon = Icon( Symbols.add_task_sharp);
and then access the icons from the Symbols
class.
This class contains outlined, rounded and sharp versions of every icon. You access them using Symbols.iconname
(for the outlined version),
and Symbols.iconname_rounded
or Symbols.iconname_sharp
for the rounded and sharp versions respectively.
Additionally the Material Symbols specification document also specifies
a Symbols.get(String name, SymbolStyle style) method that can be used to return the IconData for any icon using it's
icon name and style (SymbolStyle.outlined, SymbolStyle.rounded, or SymbolStyle.sharp). The get() method is not included on
Symbols by default to avoid needlessly bringing in the large name->codepoint map, it can be included by using import 'package:material_symbols_icons/get.dart'.
When using the get() method tree-shaking must be turned off using
--no-tree-shake-icons
as there is no way for the compiler to know what icons are being used.
SymbolsGet.values
can be used to access an Iterable<String>
of the icon names for each available icon.
SymbolsGet.map
can be used to access a Map<String,int>
of the icon names to unicode code points for each icon.
You can optionally import 'package:material_symbols_icons/symbols_map.dart';
to force
references to every icon's IconData object and prevent all tree-shaking from occuring.
This is used by the example app to allow previewing of all icons.
// `import 'package:material_symbols_icons/symbols_map.dart';` or
// optionally turn off icon tree-shaking when using the get() method!
// ( build with `--no-tree-shake-icons` )
import 'package:material_symbols_icons/symbols_map.dart';
import 'package:material_symbols_icons/get.dart';
final iconRounded = SymbolsGet.get('airplane',SymbolStyle.rounded);
final iconSharp = SymbolsGet.get('airplane',SymbolStyle.sharp);
final iconOutlined = SymbolsGet.get('airplane',SymbolStyle.outlined);
// access iconname->codepoint map
final unicodeCodePointAirplane = SymbolsGet.map['airplane'];
// iterate on and print all available icon names
for(var iconname in SymbolsGet.values) {
print(iconname);
}
All icons share the same name they had in the Material Icons Icons class.
All icon names that start with a number (like 360
or 9mp
) but have their icon name changed so that the number is written out and may have
added _
separating numbers. For example 3d_rotation
becomes threed_rotation
, 123
becomes onetwothree
, 360
becomes threesixty
,
9mp
becomes nine_mp
, 2d
becomes twod
, 3d
becomes threed
.
This is done to generate valid dart class member names.
For example if you want to access the icon with the name 360
you use Symbols.threesixty
instead.
Additionally the iconnames class
, switch
, and try
have also been renamed with a trailing '_'
(class_
, switch_
and try_
) as these are dart language
reserved words. door_back
and door_front
have also been renamed door_back_door
and door_front_door
respectively.
power_rounded
becomes power_rounded_power
(and therefor power_rounded_power_rounded
for the rounded version and
power_rounded_power_sharp
for the sharp version.
(likewise error_circle_rounded
becomes error_circle_rounded_error
).
The middle 4 digit number (for example 2758
) of the version number corresponds to the version number of of the variable fonts used to generated the icon data (with the decimal point removed). (2758
corresponds to version number (Version 2.758
)). This is found in the name
table of the variable font true type (.ttf)). Thus it can be used to determine the variable source font TTF version numbers used to generate a given version of this package. (The version number can also be found in the fontRevision
property of the head
table of the .ttf font files).
The Material Symbols Icon fonts are variable fonts, so it is possible to further modify (or animate!) the icons by specifying your own parameters for fill, weight, grade, and optical size when creating your icons. The live web example app will show you a preview of the Icon(...)
statement required to accomplish the currently visible axis settings. This takes into account the default configuration for each axis, wichi is weight at 400, optical size at 48, grade at 0 and fill also 0. Any axis which differs from the default will be included in the shown Icon(...)
example.
final myIcon = Icon( Symbols.settings,
fill: 1, weight: 700, grade: 0.25, opticalSize: 48 );
]You can also set application wide defaults using your IconThemeData
within your Theme.
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
/*
Set default IconThemeData() for ALL icons
*/
return MaterialApp(
title: 'Material Symbols Icons For Flutter',
theme: ThemeData(
primarySwatch: Colors.teal,
useMaterial3: true,
fontFamily: 'Roboto',
iconTheme: const IconThemeData(color: Colors.black,
fill: 0,
weight: 100,
opticalSize: 48),
),
home: const MyHomePage(title: 'Material Symbols Icons For Flutter'),
);
}
}
This package includes an automatic generator program so that the user has the option of regenerating the package at any time with the most current Material Symbols Icons definitions. This program downloads the latest Material Symbols fonts from the github repository https://github.com/google/material-design-icons, and their corresponding codepoint definition files. It will then automatically create the material_symbols_icons.dart definition source file. This automatic generations allows this package to use Github CI routines to ensure that it is always up to date and in-sync with the latet Material Symbols defintions.
(For users of the previous Flutter alternatives for Material Symbols Icons support - No more finding an icon on google's material symbols icon browser and then trying to use it's name, and then discovering that it is missing, or worse yet having the incorrect icon appear!)
Material Symbols Icons - Google's replacement to the original material design icons
Following background information info from google's material design icon repo.
These newer icons can be browsed in a more user-friendly way at google's material symbols icon browser. Use the popdown menu near top left to choose between the two sets; Material Symbols is the default.
These icons were built/designed as variable fonts first (based on the 24 px designs from Material Icons). There are three separate Material Symbols variable fonts, which also have static icons available (but those do not have all the variations available, as that would be hundreds of styles):
- Outlined
- Rounded
- Sharp
- Note that although there is no separate Filled font, the Fill axis allows access to filled styles—in all three fonts.
Each of the fonts has these design axes, which can be varied in CSS, or in many more modern design apps:
- Optical Size (opsz) from 20 to 48 px. The default is 24.
- Weight from 100 (Thin) to 700 (Bold). Regular is 400.
- Grade from -50 to 200. The default is 0 (zero).
- Fill from 0 to 100. The default is 0 (zero).
What is currently not available in Material Symbols?
- only the 20 and 24 px versions are designed with perfect pixel-grid alignment
- the only pre-made fonts are the variable fonts
- there are no two-tone icons
NOTE: The following is specific to this material_symbols_icons package and will not be present in the future flutter native Symbols
class,
although the code from this package could mimic this behavior in the future if desired.
If you find yourself using more than one of the styles simultaneously this package has a method of specifying default variations on a per style basis using:
MaterialSymbolsBase.setOutlinedVariationDefaults(
color: Colors.red,
fill: 1,
weight: 300,
grade: 0,
opticalSize: 40.0);
MaterialSymbolsBase.setRoundedVariationDefaults(
color: Colors.blue,
fill: 0,
weight: 400,
grade: 200,
opticalSize: 48.0);
MaterialSymbolsBase.setSharpVariationDefaults(
color: Colors.teal,
fill: 0,
weight: 600,
grade: 0.25,
opticalSize: 20.0);
// then use VariedIcon.varied() to create your icons - instead of Icon() directly
Icon example = VariedIcon.varied( Symbols.developer );
If the setOutlinedVariationDefaults
, setRoundedVariationDefaults
or setSharpVariationDefaults
methods are used then the icons need to be
created using VariedIcon.varied()
call instead of Icon()
directly.
Libraries
- get
- The
SymbolsGet
extension on Symbols adds a method to retrieve an icon based on its name and desired style variation. It also provides avalues
getter providing an array of all available icon names. Additionally it provides amap
getter to allow access to the map of icon names to code points. - iconname_to_unicode_map
- symbols_map
- material_symbols_icons BaseClass
- Material Symbols Icons library base class which contains method to force proper icon tree-shaking, and utility methods providing alternate method of icon variation defaults to be defined by icon style (implemented using font family names to differentiate icon styles).
- symbols Symbols
- All three Material Symbols icon styles within Symbols - The outline versions have no suffix and the sharp and rounded versions of each icon
have the style as a suffix to the icon name.
The outlined style versions are accessed via
Symbols.iconname
. The sharp and rounded styles are accessed viaSymbols.iconname_style
, for exampleSymbols.circle_sharp
orSymbols.circle_rounded
.