Easily extend the theming in flutter. Add custom properties and styles for custom widgets in a heartbeat.

This package contains the annotation for ext_theme_generator.


This package contains the annotation ExtTheme which you can use to generate a custom theme for your app containing custom properties as well as the default ThemeData.

Getting started

Start by adding this package as a normal dependency.

ext_theme: any

and add ext_theme_generator as a dev_dependency.

ext_theme_generator: any


Your custom theme will be up and running in no time, just follow these steps.

Step 1: Create your custom theme data

Create a file for your custom theme(data). For example: my_theme.dart.

Create the class which will hold your custom properties and annotate it with @ExtTheme(). Also don't forget to add the part section, or else the generator can't generate the theme.

part my_theme.g.dart;

class MyData {
    final Color customColor;

    const MyData({required this.customColor});

Step 2: Generate the theme classes

Run build_runner to generate your custom theme.

flutter pub run build_runner build

Step 3: Configure your themes

Use your newly generated theme classes to define your themes.

final myLightTheme = ExtendedThemeData(
    data: ThemeData.light(),
    extData: MyData(customColor: Colors.orange),

final myDarkTheme = ExtendedThemeData(
    data: ThemeData.dark(),
    extData: MyData(customColor: Colors.red),

Step 4: Add to MaterialApp

To be able to access our new theme, we need to add it to the MaterialApp. We will use the conveniently generated .builder function.

return MaterialApp(
    builder: ExtendedTheme.builder(
    	light: myLightTheme,
    	dark: myDarkTheme,

Step 5: Use your theme

// grab the current active theme from context.
final myTheme = ExtendedTheme.of(context);
// access ThemeData properties.
final scaffoldColor = myTheme.data.scaffoldBackgroundColor;
 // access custom properties. 
final customColor = myTheme.extendedData.customColor;

Optional: Use custom names

You can choose to define your own names for the classes that this package will generate by overriding them in the @ExtTheme() annotation.

This way you can make the generated theme feel more app specific.


Setting widgetName tells the generator which name to use for the Widget that you add to the widget tree and use to get the ExtendedThemeData from context.

@ExtTheme(widgetName: 'MyTheme')

ExtendedTheme.of(context); // before
MyTheme.of(context); // after


Setting dataClassName tells the generator which name to use instead of ExtendedThemeData. This is the class you use to define your themes.

@ExtTheme(dataClassName: 'MyThemeData')

final mylightTheme = ExtendedThemeData(...); // before
final mylightTheme = MyThemeData(...); // after


Setting extendedDataFieldName tells the generator which name to use for getting your custom data from ExtendedThemeData.

@ExtTheme(extDataFieldName: 'custom')

ExtendedTheme.of(context).extendedData.customColor; // before
ExtendedTheme.of(context).custom.customColor; // after


Setting dataFieldName tells the generator which name to use for getting the original data from ExtendedThemeData.

@ExtTheme(dataFieldName: 'd')

ExtendedTheme.of(context).data.scaffoldBackgroundColor; // before
ExtendedTheme.of(context).d.scaffoldBackgroundColor; // after

Additional information

This package is based on a solution I proposed in this article for which you have to create several classes/widgets yourself. This package will do all of that for you.