extension<T extends Object> method

T extension<T extends Object>()

Obtains a particular ThemeExtension.

Creating and passing a ThemeExtension to FColors

class BrandColors extends ThemeExtension<BrandColors> {
  final Color accent;
  final Color onAccent;

  const BrandColors({required this.accent, required this.onAccent});

  @override
  BrandColors copyWith({Color? accent, Color? onAccent}) =>
      BrandColors(accent: accent ?? this.accent, onAccent: onAccent ?? this.onAccent);

  @override
  BrandColors lerp(BrandColors? other, double t) {
    if (other is! BrandColors) return this;
    return BrandColors(
      accent: Color.lerp(accent, other.accent, t)!,
      onAccent: Color.lerp(onAccent, other.onAccent, t)!,
    );
  }
}

Passing it via constructor:

final colors = FColors(
  extensions: [BrandColors(accent: Color(0xFF6366F1), onAccent: Color(0xFFFFFFFF))],
  ... // other fields omitted for brevity
);

Passing it via copyWith:

colors.copyWith(extensions: [
  BrandColors(accent: Color(0xFF6366F1), onAccent: Color(0xFFFFFFFF)),
]);

Accessing the extension

final brand = context.theme.colors.extension<BrandColors>();

It is recommended to define a getter for your ThemeExtension:

extension FColorsBrandColors on FColors {
  BrandColors get brand => extension<BrandColors>();

  // Alternatively
  Color get accent => extension<BrandColors>().accent;
}

final brand = context.theme.colors.brand;

final accent = context.theme.colors.accent;

Implementation

T extension<T extends Object>() => _extensions[T]! as T;