// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'button.dart'; import 'button_theme.dart'; import 'material_button.dart'; import 'theme.dart'; import 'theme_data.dart'; /// A Material Design "flat button". /// /// ### This class is deprecated, please use [TextButton] instead. /// /// FlatButton, RaisedButton, and OutlineButton have been replaced by /// [TextButton], [ElevatedButton], and [OutlinedButton] respectively. /// ButtonTheme has been replaced by [TextButtonTheme], /// [ElevatedButtonTheme], and [OutlinedButtonTheme]. The original classes /// will eventually be removed, please migrate code that uses them. /// There's a detailed migration guide for the new button and button /// theme classes in /// [flutter.dev/go/material-button-migration-guide](https://flutter.dev/go/material-button-migration-guide). @Deprecated( 'Use TextButton instead. See the migration guide in flutter.dev/go/material-button-migration-guide). ' 'This feature was deprecated after v1.25.0-8.1.pre.' ) class FlatButton extends MaterialButton { /// Create a simple text button. /// /// The [autofocus] and [clipBehavior] arguments must not be null. const FlatButton({ Key? key, required VoidCallback? onPressed, VoidCallback? onLongPress, ValueChanged? onHighlightChanged, MouseCursor? mouseCursor, ButtonTextTheme? textTheme, Color? textColor, Color? disabledTextColor, Color? color, Color? disabledColor, Color? focusColor, Color? hoverColor, Color? highlightColor, Color? splashColor, Brightness? colorBrightness, EdgeInsetsGeometry? padding, VisualDensity? visualDensity, ShapeBorder? shape, Clip clipBehavior = Clip.none, FocusNode? focusNode, bool autofocus = false, MaterialTapTargetSize? materialTapTargetSize, required Widget child, double? height, double? minWidth, }) : assert(clipBehavior != null), assert(autofocus != null), super( key: key, height: height, minWidth: minWidth, onPressed: onPressed, onLongPress: onLongPress, onHighlightChanged: onHighlightChanged, mouseCursor: mouseCursor, textTheme: textTheme, textColor: textColor, disabledTextColor: disabledTextColor, color: color, disabledColor: disabledColor, focusColor: focusColor, hoverColor: hoverColor, highlightColor: highlightColor, splashColor: splashColor, colorBrightness: colorBrightness, padding: padding, visualDensity: visualDensity, shape: shape, clipBehavior: clipBehavior, focusNode: focusNode, autofocus: autofocus, materialTapTargetSize: materialTapTargetSize, child: child, ); /// Create a text button from a pair of widgets that serve as the button's /// [icon] and [label]. /// /// The icon and label are arranged in a row and padded by 12 logical pixels /// at the start, and 16 at the end, with an 8 pixel gap in between. /// /// The [icon], [label], and [clipBehavior] arguments must not be null. factory FlatButton.icon({ Key? key, required VoidCallback? onPressed, VoidCallback? onLongPress, ValueChanged? onHighlightChanged, MouseCursor? mouseCursor, ButtonTextTheme? textTheme, Color? textColor, Color? disabledTextColor, Color? color, Color? disabledColor, Color? focusColor, Color? hoverColor, Color? highlightColor, Color? splashColor, Brightness? colorBrightness, EdgeInsetsGeometry? padding, ShapeBorder? shape, Clip clipBehavior, FocusNode? focusNode, bool autofocus, MaterialTapTargetSize? materialTapTargetSize, required Widget icon, required Widget label, double? minWidth, double? height, }) = _FlatButtonWithIcon; @override Widget build(BuildContext context) { final ThemeData theme = Theme.of(context); final ButtonThemeData buttonTheme = ButtonTheme.of(context); return RawMaterialButton( onPressed: onPressed, onLongPress: onLongPress, onHighlightChanged: onHighlightChanged, mouseCursor: mouseCursor, fillColor: buttonTheme.getFillColor(this), textStyle: theme.textTheme.button!.copyWith(color: buttonTheme.getTextColor(this)), focusColor: buttonTheme.getFocusColor(this), hoverColor: buttonTheme.getHoverColor(this), highlightColor: buttonTheme.getHighlightColor(this), splashColor: buttonTheme.getSplashColor(this), elevation: buttonTheme.getElevation(this), focusElevation: buttonTheme.getFocusElevation(this), hoverElevation: buttonTheme.getHoverElevation(this), highlightElevation: buttonTheme.getHighlightElevation(this), disabledElevation: buttonTheme.getDisabledElevation(this), padding: buttonTheme.getPadding(this), visualDensity: visualDensity ?? theme.visualDensity, constraints: buttonTheme.getConstraints(this).copyWith( minWidth: minWidth, minHeight: height, ), shape: buttonTheme.getShape(this), clipBehavior: clipBehavior, focusNode: focusNode, autofocus: autofocus, materialTapTargetSize: buttonTheme.getMaterialTapTargetSize(this), animationDuration: buttonTheme.getAnimationDuration(this), child: child, ); } } /// The type of FlatButtons created with [FlatButton.icon]. /// /// This class only exists to give FlatButtons created with [FlatButton.icon] /// a distinct class for the sake of [ButtonTheme]. It can not be instantiated. class _FlatButtonWithIcon extends FlatButton with MaterialButtonWithIconMixin { _FlatButtonWithIcon({ Key? key, required VoidCallback? onPressed, VoidCallback? onLongPress, ValueChanged? onHighlightChanged, MouseCursor? mouseCursor, ButtonTextTheme? textTheme, Color? textColor, Color? disabledTextColor, Color? color, Color? disabledColor, Color? focusColor, Color? hoverColor, Color? highlightColor, Color? splashColor, Brightness? colorBrightness, EdgeInsetsGeometry? padding, ShapeBorder? shape, Clip clipBehavior = Clip.none, FocusNode? focusNode, bool autofocus = false, MaterialTapTargetSize? materialTapTargetSize, required Widget icon, required Widget label, double? minWidth, double? height, }) : assert(icon != null), assert(label != null), assert(clipBehavior != null), assert(autofocus != null), super( key: key, onPressed: onPressed, onLongPress: onLongPress, onHighlightChanged: onHighlightChanged, mouseCursor: mouseCursor, textTheme: textTheme, textColor: textColor, disabledTextColor: disabledTextColor, color: color, disabledColor: disabledColor, focusColor: focusColor, hoverColor: hoverColor, highlightColor: highlightColor, splashColor: splashColor, colorBrightness: colorBrightness, padding: padding, shape: shape, clipBehavior: clipBehavior, focusNode: focusNode, autofocus: autofocus, materialTapTargetSize: materialTapTargetSize, child: Row( mainAxisSize: MainAxisSize.min, children: [ icon, const SizedBox(width: 8.0), label, ], ), minWidth: minWidth, height: height, ); }