extension<T extends Object> method

T extension<T extends Object>()

Obtains a particular ThemeExtension.

Creating and passing a ThemeExtension to FStyle

class BrandStyle extends ThemeExtension<BrandStyle> {
  final double cardRadius;

  const BrandStyle({required this.cardRadius});

  @override
  BrandStyle copyWith({double? cardRadius}) => BrandStyle(cardRadius: cardRadius ?? this.cardRadius);

  @override
  BrandStyle lerp(BrandStyle? other, double t) {
    if (other is! BrandStyle) return this;
    return BrandStyle(cardRadius: lerpDouble(cardRadius, other.cardRadius, t)!);
  }
}

Passing it via constructor:

final style = FStyle(
  extensions: [BrandStyle(cardRadius: 12)],
  ... // other fields omitted for brevity
);

Passing it via copyWith:

style.copyWith(extensions: [BrandStyle(cardRadius: 12)]);

Accessing the extension

final brand = context.theme.style.extension<BrandStyle>();

It is recommended to define a getter for your ThemeExtension:

extension FStyleBrandStyle on FStyle {
  BrandStyle get brand => extension<BrandStyle>();

  // Alternatively
  double get cardRadius => extension<BrandStyle>().cardRadius;
}

final brand = context.theme.style.brand;

final cardRadius = context.theme.style.cardRadius;

Implementation

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