Skip to content

Instantly share code, notes, and snippets.

@hawkkiller
Last active November 5, 2022 23:07
Show Gist options
  • Save hawkkiller/b44bdd71ab007965f2d50c53d9eabcc9 to your computer and use it in GitHub Desktop.
Save hawkkiller/b44bdd71ab007965f2d50c53d9eabcc9 to your computer and use it in GitHub Desktop.

General Purpose

part 'theme.g.dart';

@ThemeGen(name: 'Light')
class _$AppThemeLight {}

@ThemeGen(name: 'Dark')
class _$AppThemeDark {}

@ThemeGenExtension(parent: _$AppThemeLight, name: 'AppColors')
class _$LightColors {
    // fields must be static const
    static const background = Color(0xFFEEEEEE);
    static const primary = Color(0xFFFFFFFF);
}

@ThemeGenExtension(parent: _$AppThemeDark, name: 'AppColors')
class _$DarkColors {
    // fields must be static const
    static const background = Color(0xFFEEEEED);
    static const primary = Color(0xFFFFFFFF);
}

@ThemeGenExtension(parent: _$AppThemeLight, name: 'FontStyles')
class _$LightFontStyles {
    // fields must be static const
    static const h1 = FontStyle(...);
    static const h2 = FontStyle(...);
}

@ThemeGenExtension(parent: _$AppThemeDark, name: 'FontStyles')
class _$DarkFontStyles {
    // fields must be static const
    static const h1 = FontStyle(...);
    static const h2 = FontStyle(...);
}

will generate

class AppTheme {
    static const lightExtensions = [
        AppColors.light(),
        FontStyles.light(),
    ];
    static const darkExtensions = [
        AppColors.dark(),
        FontStyles.dark(),
    ];
}

class AppColors extends ThemeExtension<AppColors> {
    AppColors({
        required this.background,
        required this.primary,
    });

    final Color background;
    final Color primary;

    factory AppColors.light({
        Color? background,
        Color? primary,
    }) => AppColors(
            background: background ?? _$LightColors.background,
            primary: primary ?? _$LightColors.primary,
        );

    factory AppColors.dark({
        Color? background,
        Color? primary,
    }) => AppColors(
            background: background ?? _$DarkColors.background,
            primary: primary ?? _$DarkColors.primary,
        );

    copywith.. 

    hashcode.. 

    operator==..

    toString..
    
    lerp
}

class FontStyles extends ThemeExtension<FontStyles> {
    FontStyles({
        required this.h1,
        required this.h2,
    });

    final FontStyle h1;
    final FontStyle h2;

    factory FontStyles.light({
        FontStyle? h1,
        FontStyle? h2,
    }) => FontStyles(
            h1: h1 ?? _$LightFontStyles.h1,
            h2: h2 ?? _$LightFontStyles.h2,
        );

    factory FontStyles.dark({
        FontStyle? h1,
        FontStyle? h2,
    }) => FontStyles(
            h1: h1 ?? _$DarkFontStyles.h1,
            h2: h2 ?? _$DarkFontStyles.h2,
        );

    copywith.. 

    hashcode.. 

    operator==..

    toString..
    
    lerp
}
@purplenoodlesoop
Copy link

Насчет интерфейсов были мысли немного по-другому применить.

class DarkPaddingsDefinition extends CustomExtension<double> {
  const DarkPaddingsDefinition();
  
  @override
  ExtensionData<double> get data => {#small: 4};
}

class DarkTheme extends $ThemeDefinition {
  @override
  ColorsDefinition get color => {#primary: Colors.white};
  
  @override
  StylesDefinition styles(DarkColors colors) => {#h1: TextStyle(color: colors.primary)};
  
  @override
  CustomDefinition get custom => const {#paddings: DarkPaddingsDefinition()};
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment