search ESC

Searching…

No results for "".

Type at least 2 characters to search.

Docs

Theme Binding

Theme binding allows you to sync your Wind configuration with Flutter's native ThemeData system. This ensures that standard Material widgets automatically reflect your Wind tokens, creating a cohesive visual experience across your entire application.

Why Bind Themes?

By default, Wind manages its own styling tokens (colors, spacing, typography). However, Flutter's built-in widgets (like AppBar, FloatingActionButton, or TextField) rely on the standard Theme.of(context) to determine their appearance.

Binding the two systems ensures:

  • Consistency: A button using bg-primary-500 matches a standard ElevatedButton.
  • Inheritance: Standard Flutter widgets automatically pick up your Wind font families and colors.
  • Automation: Toggling dark mode in Wind automatically updates the brightness of your standard Material theme.

Reactive Binding

To ensure your entire application rebuilds when the theme changes (e.g., switching to dark mode), use the builder pattern. This provides a WindController that dynamically generates a new ThemeData whenever the state updates.

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final windTheme = WindThemeData(
      colors: {
        'primary': Colors.indigo,
        'secondary': Colors.teal,
      },
    );

    return WindTheme(
      data: windTheme,
      builder: (context, controller) {
        // controller.toThemeData() produces a standard Flutter ThemeData
        return MaterialApp(
          theme: controller.toThemeData(),
          home: const HomePage(),
        );
      },
    );
  }
}

Toggling Themes

When using the reactive builder pattern, you can trigger a global theme update from anywhere in the widget tree. This will automatically update both Wind utilities and standard Material widgets.

// Toggle between Light and Dark mode
context.windTheme.toggleTheme();

Static Binding

If you do not need dynamic theme switching at runtime, you can bind the theme once during initialization. This is useful for apps with a fixed brand identity or forced dark/light modes.

final windTheme = WindThemeData(
  brightness: Brightness.dark,
  colors: {'primary': Colors.purple},
);

return WindTheme(
  data: windTheme,
  child: MaterialApp(
    theme: windTheme.toThemeData(),
    home: const HomePage(),
  ),
);

Mapping Reference

The toThemeData() method intelligently maps Wind tokens to their standard Flutter counterparts:

Wind Token Flutter Theme Property
colors['primary'] colorScheme.primary
colors['secondary'] colorScheme.secondary
colors['error'] colorScheme.error
colors['background'] scaffoldBackgroundColor
brightness brightness
fontFamilies['sans'] textTheme.fontFamily

This mapping ensures that your utility-first styles and native widgets stay perfectly in sync.