final class ButtonSpec extends Spec<ButtonSpec>
with Diagnosticable, _$ButtonSpecMethods {
@override
final StyleSpec<FlexBoxSpec>? container;
@override
final StyleSpec<IconSpec>? icon;
@override
final StyleSpec<TextSpec>? label;
const ButtonSpec({
this.container,
this.icon,
this.label,
});
}
class UIButton extends StatelessWidget {
const UIButton({
super.key,
required this.onPressed,
this.child,
this.icon,
this.style,
this.variant = ButtonVariant.primary,
this.size = ButtonVariantSize.sm,
});
final VoidCallback onPressed;
final Widget? child;
final Widget? icon;
final ButtonStyler? style;
final ButtonVariant variant;
final ButtonVariantSize size;
@override
Widget build(BuildContext context) {
final child = this.child;
final icon = this.icon;
return StyleBuilder(
style: _getButtonStyle(
style,
variant: variant,
size: size,
),
builder: (context, spec) => FlexBox(
styleSpec: spec.container,
children: [
if (spec.label != null && child != null)
StyleSpecProvider(
spec: spec.label!,
child: child,
),
if (spec.icon != null && icon != null)
StyleSpecProvider(
spec: spec.icon!,
child: icon,
),
],
),
);
}
}
UIButton(
onPressed: () {},
size: size,
variant: variant,
child: StyledText(
title,
styleSpec: StyleSpecProvider.of<TextSpec>(context),
style: TextStyler().fontSize(38) // <= merge context style,and make font bigger only
),
);
Use case
We have Spec
The button widget,with
Widget childandWidget iconProposal
What we want to do is: