styleFrom static method

ButtonStyle styleFrom(
  1. {Color? foregroundColor,
  2. Color? backgroundColor,
  3. Color? disabledForegroundColor,
  4. Color? disabledBackgroundColor,
  5. Color? shadowColor,
  6. Color? surfaceTintColor,
  7. Color? iconColor,
  8. Color? disabledIconColor,
  9. Color? overlayColor,
  10. double? elevation,
  11. TextStyle? textStyle,
  12. EdgeInsetsGeometry? padding,
  13. Size? minimumSize,
  14. Size? fixedSize,
  15. Size? maximumSize,
  16. BorderSide? side,
  17. OutlinedBorder? shape,
  18. MouseCursor? enabledMouseCursor,
  19. MouseCursor? disabledMouseCursor,
  20. VisualDensity? visualDensity,
  21. MaterialTapTargetSize? tapTargetSize,
  22. Duration? animationDuration,
  23. bool? enableFeedback,
  24. AlignmentGeometry? alignment,
  25. InteractiveInkFeatureFactory? splashFactory,
  26. ButtonLayerBuilder? backgroundBuilder,
  27. ButtonLayerBuilder? foregroundBuilder}
)

A static convenience method that constructs an outlined button ButtonStyle given simple values.

The foregroundColor and disabledForegroundColor colors are used to create a MaterialStateProperty ButtonStyle.foregroundColor, and a derived ButtonStyle.overlayColor if overlayColor isn't specified.

The backgroundColor and disabledBackgroundColor colors are used to create a MaterialStateProperty ButtonStyle.backgroundColor.

Similarly, the enabledMouseCursor and disabledMouseCursor parameters are used to construct ButtonStyle.mouseCursor and iconColor, disabledIconColor are used to construct ButtonStyle.iconColor.

If overlayColor is specified and its value is Colors.transparent then the pressed/focused/hovered highlights are effectively defeated. Otherwise a MaterialStateProperty with the same opacities as the default is created.

All of the other parameters are either used directly or used to create a MaterialStateProperty with a single value for all states.

All parameters default to null, by default this method returns a ButtonStyle that doesn't override anything.

For example, to override the default shape and outline for an OutlinedButton, one could write:

OutlinedButton(
  style: OutlinedButton.styleFrom(
     shape: const StadiumBorder(),
     side: const BorderSide(width: 2, color: Colors.green),
  ),
  child: const Text('Seasons of Love'),
  onPressed: () {
    // ...
  },
),

Implementation

static ButtonStyle styleFrom({
  Color? foregroundColor,
  Color? backgroundColor,
  Color? disabledForegroundColor,
  Color? disabledBackgroundColor,
  Color? shadowColor,
  Color? surfaceTintColor,
  Color? iconColor,
  Color? disabledIconColor,
  Color? overlayColor,
  double? elevation,
  TextStyle? textStyle,
  EdgeInsetsGeometry? padding,
  Size? minimumSize,
  Size? fixedSize,
  Size? maximumSize,
  BorderSide? side,
  OutlinedBorder? shape,
  MouseCursor? enabledMouseCursor,
  MouseCursor? disabledMouseCursor,
  VisualDensity? visualDensity,
  MaterialTapTargetSize? tapTargetSize,
  Duration? animationDuration,
  bool? enableFeedback,
  AlignmentGeometry? alignment,
  InteractiveInkFeatureFactory? splashFactory,
  ButtonLayerBuilder? backgroundBuilder,
  ButtonLayerBuilder? foregroundBuilder,
}) {
  final MaterialStateProperty<Color?>? foregroundColorProp = switch ((foregroundColor, disabledForegroundColor)) {
    (null, null) => null,
    (_, _) => _OutlinedButtonDefaultColor(foregroundColor, disabledForegroundColor),
  };
  final MaterialStateProperty<Color?>? backgroundColorProp = switch ((backgroundColor, disabledBackgroundColor)) {
    (null, null) => null,
    (_, null) => MaterialStatePropertyAll<Color?>(backgroundColor),
    (_, _) => _OutlinedButtonDefaultColor(backgroundColor, disabledBackgroundColor),
  };
  final MaterialStateProperty<Color?>? iconColorProp = switch ((iconColor, disabledIconColor)) {
    (null, null) => null,
    (_, _) => _OutlinedButtonDefaultColor(iconColor, disabledIconColor),
  };
  final MaterialStateProperty<Color?>? overlayColorProp = switch ((foregroundColor, overlayColor)) {
    (null, null) => null,
    (_, final Color overlayColor) when overlayColor.value == 0 => const MaterialStatePropertyAll<Color?>(Colors.transparent),
    (_, _) => _OutlinedButtonDefaultOverlay((overlayColor ?? foregroundColor)!),
  };
  final MaterialStateProperty<MouseCursor?> mouseCursor = _OutlinedButtonDefaultMouseCursor(enabledMouseCursor, disabledMouseCursor);

  return ButtonStyle(
    textStyle: ButtonStyleButton.allOrNull<TextStyle>(textStyle),
    foregroundColor: foregroundColorProp,
    backgroundColor: backgroundColorProp,
    overlayColor: overlayColorProp,
    shadowColor: ButtonStyleButton.allOrNull<Color>(shadowColor),
    surfaceTintColor: ButtonStyleButton.allOrNull<Color>(surfaceTintColor),
    iconColor: iconColorProp,
    elevation: ButtonStyleButton.allOrNull<double>(elevation),
    padding: ButtonStyleButton.allOrNull<EdgeInsetsGeometry>(padding),
    minimumSize: ButtonStyleButton.allOrNull<Size>(minimumSize),
    fixedSize: ButtonStyleButton.allOrNull<Size>(fixedSize),
    maximumSize: ButtonStyleButton.allOrNull<Size>(maximumSize),
    side: ButtonStyleButton.allOrNull<BorderSide>(side),
    shape: ButtonStyleButton.allOrNull<OutlinedBorder>(shape),
    mouseCursor: mouseCursor,
    visualDensity: visualDensity,
    tapTargetSize: tapTargetSize,
    animationDuration: animationDuration,
    enableFeedback: enableFeedback,
    alignment: alignment,
    splashFactory: splashFactory,
    backgroundBuilder: backgroundBuilder,
    foregroundBuilder: foregroundBuilder,
  );
}