From eac1747169a9b65617069d4af890526b8d936273 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Sat, 11 Jul 2020 08:50:43 -0700 Subject: [PATCH] Renamed ContainedButton et al. to ElevatedButton et al. (#61262) --- packages/flutter/lib/material.dart | 4 +- .../lib/src/material/button_style.dart | 12 +- .../lib/src/material/button_style_button.dart | 4 +- .../src/material/contained_button_theme.dart | 127 ----------- ...ained_button.dart => elevated_button.dart} | 211 ++++++++++++++---- .../src/material/elevated_button_theme.dart | 160 +++++++++++++ .../lib/src/material/outlined_button.dart | 2 +- .../src/material/outlined_button_theme.dart | 4 +- .../flutter/lib/src/material/text_button.dart | 2 +- .../flutter/lib/src/material/theme_data.dart | 28 +-- ...on_test.dart => elevated_button_test.dart} | 138 ++++++------ ...t.dart => elevated_button_theme_test.dart} | 28 +-- .../test/material/theme_data_test.dart | 8 +- 13 files changed, 448 insertions(+), 280 deletions(-) delete mode 100644 packages/flutter/lib/src/material/contained_button_theme.dart rename packages/flutter/lib/src/material/{contained_button.dart => elevated_button.dart} (68%) create mode 100644 packages/flutter/lib/src/material/elevated_button_theme.dart rename packages/flutter/test/material/{contained_button_test.dart => elevated_button_test.dart} (87%) rename packages/flutter/test/material/{contained_button_theme_test.dart => elevated_button_theme_test.dart} (89%) diff --git a/packages/flutter/lib/material.dart b/packages/flutter/lib/material.dart index a10b5ce9c17..e531a6aea6c 100644 --- a/packages/flutter/lib/material.dart +++ b/packages/flutter/lib/material.dart @@ -49,8 +49,6 @@ export 'src/material/circle_avatar.dart'; export 'src/material/color_scheme.dart'; export 'src/material/colors.dart'; export 'src/material/constants.dart'; -export 'src/material/contained_button.dart'; -export 'src/material/contained_button_theme.dart'; export 'src/material/data_table.dart'; export 'src/material/data_table_source.dart'; export 'src/material/debug.dart'; @@ -61,6 +59,8 @@ export 'src/material/divider_theme.dart'; export 'src/material/drawer.dart'; export 'src/material/drawer_header.dart'; export 'src/material/dropdown.dart'; +export 'src/material/elevated_button.dart'; +export 'src/material/elevated_button_theme.dart'; export 'src/material/elevation_overlay.dart'; export 'src/material/expand_icon.dart'; export 'src/material/expansion_panel.dart'; diff --git a/packages/flutter/lib/src/material/button_style.dart b/packages/flutter/lib/src/material/button_style.dart index 85db4c106a5..61c6525d12b 100644 --- a/packages/flutter/lib/src/material/button_style.dart +++ b/packages/flutter/lib/src/material/button_style.dart @@ -29,12 +29,12 @@ import 'theme_data.dart'; /// hovered, focused, disabled, etc. /// /// These properties can override the default value for just one state or all of -/// them. For example to create a [ContainedButton] whose background color is the +/// them. For example to create a [ElevatedButton] whose background color is the /// color scheme’s primary color with 50% opacity, but only when the button is /// pressed, one could write: /// /// ```dart -/// ContainedButton( +/// ElevatedButton( /// style: ButtonStyle( /// backgroundColor: MaterialStateProperty.resolveWith( /// (Set states) { @@ -48,11 +48,11 @@ import 'theme_data.dart'; ///``` /// /// In this case the background color for all other button states would fallback -/// to the ContainedButton’s default values. To unconditionally set the button's +/// to the ElevatedButton’s default values. To unconditionally set the button's /// [backgroundColor] for all states one could write: /// /// ```dart -/// ContainedButton( +/// ElevatedButton( /// style: ButtonStyle( /// backgroundColor: MaterialStateProperty.all(Colors.green), /// ), @@ -66,7 +66,7 @@ import 'theme_data.dart'; /// useful to make relatively sweeping changes based on a few initial /// parameters with simple values. The button styleFrom() methods /// enable such sweeping changes. See for example: -/// [TextButton.styleFrom], [ContainedButton.styleFrom], +/// [TextButton.styleFrom], [ElevatedButton.styleFrom], /// [OutlinedButton.styleFrom]. /// /// For example, to override the default text and icon colors for a @@ -95,7 +95,7 @@ import 'theme_data.dart'; /// See also: /// /// * [TextButtonTheme], the theme for [TextButton]s. -/// * [ContainedButtonTheme], the theme for [ContainedButton]s. +/// * [ElevatedButtonTheme], the theme for [ElevatedButton]s. /// * [OutlinedButtonTheme], the theme for [OutlinedButton]s. @immutable class ButtonStyle with Diagnosticable { diff --git a/packages/flutter/lib/src/material/button_style_button.dart b/packages/flutter/lib/src/material/button_style_button.dart index 6fa8f21b294..4095c2ce175 100644 --- a/packages/flutter/lib/src/material/button_style_button.dart +++ b/packages/flutter/lib/src/material/button_style_button.dart @@ -27,7 +27,7 @@ import 'theme_data.dart'; /// See also: /// /// * [TextButton], a simple ButtonStyleButton without a shadow. -/// * [ContainedButton], a filled ButtonStyleButton whose material elevates when pressed. +/// * [ElevatedButton], a filled ButtonStyleButton whose material elevates when pressed. /// * [OutlinedButton], similar to [TextButton], but with an outline. abstract class ButtonStyleButton extends StatefulWidget { /// Create a [ButtonStyleButton]. @@ -177,7 +177,7 @@ abstract class ButtonStyleButton extends StatefulWidget { /// /// * [ButtonStyleButton], the [StatefulWidget] subclass for which this class is the [State]. /// * [TextButton], a simple button without a shadow. -/// * [ContainedButton], a filled button whose material elevates when pressed. +/// * [ElevatedButton], a filled button whose material elevates when pressed. /// * [OutlinedButton], similar to [TextButton], but with an outline. class _ButtonStyleState extends State { final Set _states = {}; diff --git a/packages/flutter/lib/src/material/contained_button_theme.dart b/packages/flutter/lib/src/material/contained_button_theme.dart deleted file mode 100644 index 4f9b83e2b9a..00000000000 --- a/packages/flutter/lib/src/material/contained_button_theme.dart +++ /dev/null @@ -1,127 +0,0 @@ -// 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. - -// @dart = 2.8 - -import 'package:flutter/foundation.dart'; -import 'package:flutter/widgets.dart'; - -import 'button_style.dart'; -import 'theme.dart'; - -/// A [ButtonStyle] that overrides the default appearance of -/// [ContainedButton]s when it's used with [ContainedButtonTheme] or with the -/// overall [Theme]'s [ThemeData.containedButtonTheme]. -/// -/// The [style]'s properties override [ContainedButton]'s default style, -/// i.e. the [ButtonStyle] returned by [ContainedButton.defaultStyleOf]. Only -/// the style's non-null property values or resolved non-null -/// [MaterialStateProperty] values are used. -/// -/// See also: -/// -/// * [ContainedButtonTheme], the theme which is configured with this class. -/// * [ContainedButton.defaultStyleOf], which returns the default [ButtonStyle] -/// for text buttons. -/// * [ContainedButton.styleOf], which converts simple values into a -/// [ButtonStyle] that's consistent with [ContainedButton]'s defaults. -/// * [MaterialStateProperty.resolve], "resolve" a material state property -/// to a simple value based on a set of [MaterialState]s. -/// * [ThemeData.containedButtonTheme], which can be used to override the default -/// [ButtonStyle] for [ContainedButton]s below the overall [Theme]. -@immutable -class ContainedButtonThemeData with Diagnosticable { - /// Creates a [ContainedButtonThemeData]. - /// - /// The [style] may be null. - const ContainedButtonThemeData({ this.style }); - - /// Overrides for [ContainedButton]'s default style. - /// - /// Non-null properties or non-null resolved [MaterialStateProperty] - /// values override the [ButtonStyle] returned by - /// [ContainedButton.defaultStyleOf]. - /// - /// If [style] is null, then this theme doesn't override anything. - final ButtonStyle style; - - /// Linearly interpolate between two contained button themes. - static ContainedButtonThemeData lerp(ContainedButtonThemeData a, ContainedButtonThemeData b, double t) { - assert (t != null); - if (a == null && b == null) - return null; - return ContainedButtonThemeData( - style: ButtonStyle.lerp(a?.style, b?.style, t), - ); - } - - @override - int get hashCode { - return style.hashCode; - } - - @override - bool operator ==(Object other) { - if (identical(this, other)) - return true; - if (other.runtimeType != runtimeType) - return false; - return other is ContainedButtonThemeData && other.style == style; - } - - @override - void debugFillProperties(DiagnosticPropertiesBuilder properties) { - super.debugFillProperties(properties); - properties.add(DiagnosticsProperty('style', style, defaultValue: null)); - } -} - -/// Overrides the default [ButtonStyle] of its [ContainedButton] descendants. -/// -/// See also: -/// -/// * [ContainedButtonThemeData], which is used to configure this theme. -/// * [ContainedButton.defaultStyleOf], which returns the default [ButtonStyle] -/// for text buttons. -/// * [ContainedButton.styleOf], which converts simple values into a -/// [ButtonStyle] that's consistent with [ContainedButton]'s defaults. -/// * [ThemeData.containedButtonTheme], which can be used to override the default -/// [ButtonStyle] for [ContainedButton]s below the overall [Theme]. -class ContainedButtonTheme extends InheritedTheme { - /// Create a [ContainedButtonTheme]. - /// - /// The [data] parameter must not be null. - const ContainedButtonTheme({ - Key key, - @required this.data, - Widget child, - }) : assert(data != null), super(key: key, child: child); - - /// The configuration of this theme. - final ContainedButtonThemeData data; - - /// The closest instance of this class that encloses the given context. - /// - /// If there is no enclosing [ContainedButtonsTheme] widget, then - /// [ThemeData.containedButtonTheme] is used. - /// - /// Typical usage is as follows: - /// - /// ```dart - /// ContainedButtonTheme theme = ContainedButtonTheme.of(context); - /// ``` - static ContainedButtonThemeData of(BuildContext context) { - final ContainedButtonTheme buttonTheme = context.dependOnInheritedWidgetOfExactType(); - return buttonTheme?.data ?? Theme.of(context).containedButtonTheme; - } - - @override - Widget wrap(BuildContext context, Widget child) { - final ContainedButtonTheme ancestorTheme = context.findAncestorWidgetOfExactType(); - return identical(this, ancestorTheme) ? child : ContainedButtonTheme(data: data, child: child); - } - - @override - bool updateShouldNotify(ContainedButtonTheme oldWidget) => data != oldWidget.data; -} diff --git a/packages/flutter/lib/src/material/contained_button.dart b/packages/flutter/lib/src/material/elevated_button.dart similarity index 68% rename from packages/flutter/lib/src/material/contained_button.dart rename to packages/flutter/lib/src/material/elevated_button.dart index 5eb0fad5be8..f28a312be65 100644 --- a/packages/flutter/lib/src/material/contained_button.dart +++ b/packages/flutter/lib/src/material/elevated_button.dart @@ -16,34 +16,34 @@ import 'button_style_button.dart'; import 'color_scheme.dart'; import 'colors.dart'; import 'constants.dart'; -import 'contained_button_theme.dart'; +import 'elevated_button_theme.dart'; import 'material_state.dart'; import 'theme.dart'; import 'theme_data.dart'; -/// A Material Design "contained button". +/// A Material Design "elevated button". /// -/// Use contained buttons to add dimension to otherwise mostly flat +/// Use elevated buttons to add dimension to otherwise mostly flat /// layouts, e.g. in long busy lists of content, or in wide -/// spaces. Avoid using contained buttons on already-contained content +/// spaces. Avoid using elevated buttons on already-elevated content /// such as dialogs or cards. /// -/// A contained button is a label [child] displayed on a [Material] +/// An elevated button is a label [child] displayed on a [Material] /// widget whose [Material.elevation] increases when the button is /// pressed. The label's [Text] and [Icon] widgets are displayed in /// [style]'s [ButtonStyle.onForegroundColor] and the button's filled /// background is the [ButtonStyle.backgroundColor]. /// -/// The contained button's default style is defined by -/// [defaultStyleOf]. The style of this contained button can be +/// The elevated button's default style is defined by +/// [defaultStyleOf]. The style of this elevated button can be /// overridden with its [style] parameter. The style of all contained /// buttons in a subtree can be overridden with the -/// [ContainedButtonTheme], and the style of all of the contained +/// [ElevatedButtonTheme], and the style of all of the contained /// buttons in an app can be overridden with the [Theme]'s -/// [ThemeData.containedButtonTheme] property. +/// [ThemeData.ElevatedButtonTheme] property. /// /// The static [styleFrom] method is a convenient way to create a -/// contained button [ButtonStyle] from simple values. +/// elevated button [ButtonStyle] from simple values. /// /// If [onPressed] and [onLongPress] callbacks are null, then the /// button will be disabled. @@ -53,11 +53,11 @@ import 'theme_data.dart'; /// * [TextButton], a simple flat button without a shadow. /// * [OutlinedButton], a [TextButton] with a border outline. /// * -class ContainedButton extends ButtonStyleButton { - /// Create a ContainedButton. +class ElevatedButton extends ButtonStyleButton { + /// Create an ElevatedButton. /// /// The [autofocus] and [clipBehavior] arguments must not be null. - const ContainedButton({ + const ElevatedButton({ Key key, @required VoidCallback onPressed, VoidCallback onLongPress, @@ -77,14 +77,14 @@ class ContainedButton extends ButtonStyleButton { child: child, ); - /// Create a contained button from a pair of widgets that serve as the button's + /// Create an elevated 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] and [label] arguments must not be null. - factory ContainedButton.icon({ + factory ElevatedButton.icon({ Key key, @required VoidCallback onPressed, VoidCallback onLongPress, @@ -94,9 +94,9 @@ class ContainedButton extends ButtonStyleButton { Clip clipBehavior, @required Widget icon, @required Widget label, - }) = _ContainedButtonWithIcon; + }) = _ElevatedButtonWithIcon; - /// A static convenience method that constructs a contained button + /// A static convenience method that constructs an elevated button /// [ButtonStyle] given simple values. /// /// The [onPrimary], and [onSurface] colors are used to to create a @@ -124,12 +124,12 @@ class ContainedButton extends ButtonStyleButton { /// a [ButtonStyle] that doesn't override anything. /// /// For example, to override the default text and icon colors for a - /// [ContainedButton], as well as its overlay color, with all of the + /// [ElevatedButton], as well as its overlay color, with all of the /// standard opacity adjustments for the pressed, focused, and /// hovered states, one could write: /// /// ```dart - /// ContainedButton( + /// ElevatedButton( /// style: TextButton.styleFrom(primary: Colors.green), /// ) /// ``` @@ -153,19 +153,19 @@ class ContainedButton extends ButtonStyleButton { }) { final MaterialStateProperty backgroundColor = (onSurface == null && primary == null) ? null - : _ContainedButtonDefaultBackground(primary, onSurface); + : _ElevatedButtonDefaultBackground(primary, onSurface); final MaterialStateProperty foregroundColor = (onSurface == null && onPrimary == null) ? null - : _ContainedButtonDefaultForeground(onPrimary, onSurface); + : _ElevatedButtonDefaultForeground(onPrimary, onSurface); final MaterialStateProperty overlayColor = (onPrimary == null) ? null - : _ContainedButtonDefaultOverlay(onPrimary); + : _ElevatedButtonDefaultOverlay(onPrimary); final MaterialStateProperty elevationValue = (elevation == null) ? null - : _ContainedButtonDefaultElevation(elevation); + : _ElevatedButtonDefaultElevation(elevation); final MaterialStateProperty mouseCursor = (enabledMouseCursor == null && disabledMouseCursor == null) ? null - : _ContainedButtonDefaultMouseCursor(enabledMouseCursor, disabledMouseCursor); + : _ElevatedButtonDefaultMouseCursor(enabledMouseCursor, disabledMouseCursor); return ButtonStyle( textStyle: MaterialStateProperty.all(textStyle), @@ -241,7 +241,7 @@ class ContainedButton extends ButtonStyleButton { /// * `animationDuration` - kThemeChangeDuration /// * `enableFeedback` - true /// - /// The default padding values for the [ContainedButton.icon] factory are slightly different: + /// The default padding values for the [ElevatedButton.icon] factory are slightly different: /// /// * `padding` /// * `textScaleFactor <= 1` - start(12) end(16) @@ -280,17 +280,17 @@ class ContainedButton extends ButtonStyleButton { ); } - /// Returns the [ContainedButtonThemeData.style] of the closest - /// [ContainedButtonTheme] ancestor. + /// Returns the [ElevatedButtonThemeData.style] of the closest + /// [ElevatedButtonTheme] ancestor. @override ButtonStyle themeStyleOf(BuildContext context) { - return ContainedButtonTheme.of(context)?.style; + return ElevatedButtonTheme.of(context)?.style; } } @immutable -class _ContainedButtonDefaultBackground extends MaterialStateProperty with Diagnosticable { - _ContainedButtonDefaultBackground(this.primary, this.onSurface); +class _ElevatedButtonDefaultBackground extends MaterialStateProperty with Diagnosticable { + _ElevatedButtonDefaultBackground(this.primary, this.onSurface); final Color primary; final Color onSurface; @@ -304,8 +304,8 @@ class _ContainedButtonDefaultBackground extends MaterialStateProperty wit } @immutable -class _ContainedButtonDefaultForeground extends MaterialStateProperty with Diagnosticable { - _ContainedButtonDefaultForeground(this.onPrimary, this.onSurface); +class _ElevatedButtonDefaultForeground extends MaterialStateProperty with Diagnosticable { + _ElevatedButtonDefaultForeground(this.onPrimary, this.onSurface); final Color onPrimary; final Color onSurface; @@ -319,8 +319,8 @@ class _ContainedButtonDefaultForeground extends MaterialStateProperty wit } @immutable -class _ContainedButtonDefaultOverlay extends MaterialStateProperty with Diagnosticable { - _ContainedButtonDefaultOverlay(this.onPrimary); +class _ElevatedButtonDefaultOverlay extends MaterialStateProperty with Diagnosticable { + _ElevatedButtonDefaultOverlay(this.onPrimary); final Color onPrimary; @@ -335,8 +335,8 @@ class _ContainedButtonDefaultOverlay extends MaterialStateProperty with D } @immutable -class _ContainedButtonDefaultElevation extends MaterialStateProperty with Diagnosticable { - _ContainedButtonDefaultElevation(this.elevation); +class _ElevatedButtonDefaultElevation extends MaterialStateProperty with Diagnosticable { + _ElevatedButtonDefaultElevation(this.elevation); final double elevation; @@ -355,8 +355,8 @@ class _ContainedButtonDefaultElevation extends MaterialStateProperty wit } @immutable -class _ContainedButtonDefaultMouseCursor extends MaterialStateProperty with Diagnosticable { - _ContainedButtonDefaultMouseCursor(this.enabledCursor, this.disabledCursor); +class _ElevatedButtonDefaultMouseCursor extends MaterialStateProperty with Diagnosticable { + _ElevatedButtonDefaultMouseCursor(this.enabledCursor, this.disabledCursor); final MouseCursor enabledCursor; final MouseCursor disabledCursor; @@ -369,6 +369,141 @@ class _ContainedButtonDefaultMouseCursor extends MaterialStateProperty(scaledPadding) + ); + } +} + +class _ElevatedButtonWithIconChild extends StatelessWidget { + const _ElevatedButtonWithIconChild({ Key key, this.label, this.icon }) : super(key: key); + + final Widget label; + final Widget icon; + + @override + Widget build(BuildContext context) { + final double scale = MediaQuery.of(context, nullOk: true)?.textScaleFactor ?? 1; + final double gap = scale <= 1 ? 8 : lerpDouble(8, 4, math.min(scale - 1, 1)); + return Row( + mainAxisSize: MainAxisSize.min, + children: [icon, SizedBox(width: gap), label], + ); + } +} + +/// Please use [ElevatedButton]. +@Deprecated( + 'This class was briefly released with the wrong name. The correct name is ElevatedButton. ' + 'This feature was deprecated after v1.20.0-2.0.pre.' +) +class ContainedButton extends ElevatedButton { + /// Please use [new ElevatedButton]. + const ContainedButton({ + Key key, + @required VoidCallback onPressed, + VoidCallback onLongPress, + ButtonStyle style, + FocusNode focusNode, + bool autofocus = false, + Clip clipBehavior = Clip.none, + @required Widget child, + }) : super( + key: key, + onPressed: onPressed, + onLongPress: onLongPress, + style: style, + focusNode: focusNode, + autofocus: autofocus, + clipBehavior: clipBehavior, + child: child, + ); + + /// Please use [new ElevatedButton.icon]. + factory ContainedButton.icon({ + Key key, + @required VoidCallback onPressed, + VoidCallback onLongPress, + ButtonStyle style, + FocusNode focusNode, + bool autofocus, + Clip clipBehavior, + @required Widget icon, + @required Widget label, + }) = _ContainedButtonWithIcon; + + /// Please use [ElevatedButton.styleFrom]. + static ButtonStyle styleFrom({ + Color primary, + Color onPrimary, + Color onSurface, + Color shadowColor, + double elevation, + TextStyle textStyle, + EdgeInsetsGeometry padding, + Size minimumSize, + BorderSide side, + OutlinedBorder shape, + MouseCursor enabledMouseCursor, + MouseCursor disabledMouseCursor, + VisualDensity visualDensity, + MaterialTapTargetSize tapTargetSize, + Duration animationDuration, + bool enableFeedback, + }) { + return ElevatedButton.styleFrom( + primary: primary, + onPrimary: onPrimary, + onSurface: onSurface, + shadowColor: shadowColor, + elevation: elevation, + textStyle: textStyle, + padding: padding, + minimumSize: minimumSize, + side: side, + shape: shape, + enabledMouseCursor: enabledMouseCursor, + disabledMouseCursor: disabledMouseCursor, + visualDensity: visualDensity, + tapTargetSize: tapTargetSize, + animationDuration: animationDuration, + enableFeedback: enableFeedback, + ); + } +} + class _ContainedButtonWithIcon extends ContainedButton { _ContainedButtonWithIcon({ Key key, diff --git a/packages/flutter/lib/src/material/elevated_button_theme.dart b/packages/flutter/lib/src/material/elevated_button_theme.dart new file mode 100644 index 00000000000..a580e3def07 --- /dev/null +++ b/packages/flutter/lib/src/material/elevated_button_theme.dart @@ -0,0 +1,160 @@ +// 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. + +// @dart = 2.8 + +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +import 'button_style.dart'; +import 'theme.dart'; + +/// A [ButtonStyle] that overrides the default appearance of +/// [ElevatedButton]s when it's used with [ElevatedButtonTheme] or with the +/// overall [Theme]'s [ThemeData.ElevatedButtonTheme]. +/// +/// The [style]'s properties override [ElevatedButton]'s default style, +/// i.e. the [ButtonStyle] returned by [ElevatedButton.defaultStyleOf]. Only +/// the style's non-null property values or resolved non-null +/// [MaterialStateProperty] values are used. +/// +/// See also: +/// +/// * [ElevatedButtonTheme], the theme which is configured with this class. +/// * [ElevatedButton.defaultStyleOf], which returns the default [ButtonStyle] +/// for text buttons. +/// * [ElevatedButton.styleOf], which converts simple values into a +/// [ButtonStyle] that's consistent with [ElevatedButton]'s defaults. +/// * [MaterialStateProperty.resolve], "resolve" a material state property +/// to a simple value based on a set of [MaterialState]s. +/// * [ThemeData.ElevatedButtonTheme], which can be used to override the default +/// [ButtonStyle] for [ElevatedButton]s below the overall [Theme]. +@immutable +class ElevatedButtonThemeData with Diagnosticable { + /// Creates an [ElevatedButtonThemeData]. + /// + /// The [style] may be null. + const ElevatedButtonThemeData({ this.style }); + + /// Overrides for [ElevatedButton]'s default style. + /// + /// Non-null properties or non-null resolved [MaterialStateProperty] + /// values override the [ButtonStyle] returned by + /// [ElevatedButton.defaultStyleOf]. + /// + /// If [style] is null, then this theme doesn't override anything. + final ButtonStyle style; + + /// Linearly interpolate between two elevated button themes. + static ElevatedButtonThemeData lerp(ElevatedButtonThemeData a, ElevatedButtonThemeData b, double t) { + assert (t != null); + if (a == null && b == null) + return null; + return ElevatedButtonThemeData( + style: ButtonStyle.lerp(a?.style, b?.style, t), + ); + } + + @override + int get hashCode { + return style.hashCode; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) + return true; + if (other.runtimeType != runtimeType) + return false; + return other is ElevatedButtonThemeData && other.style == style; + } + + @override + void debugFillProperties(DiagnosticPropertiesBuilder properties) { + super.debugFillProperties(properties); + properties.add(DiagnosticsProperty('style', style, defaultValue: null)); + } +} + +/// Overrides the default [ButtonStyle] of its [ElevatedButton] descendants. +/// +/// See also: +/// +/// * [ElevatedButtonThemeData], which is used to configure this theme. +/// * [ElevatedButton.defaultStyleOf], which returns the default [ButtonStyle] +/// for elevated buttons. +/// * [ElevatedButton.styleOf], which converts simple values into a +/// [ButtonStyle] that's consistent with [ElevatedButton]'s defaults. +/// * [ThemeData.ElevatedButtonTheme], which can be used to override the default +/// [ButtonStyle] for [ElevatedButton]s below the overall [Theme]. +class ElevatedButtonTheme extends InheritedTheme { + /// Create a [ElevatedButtonTheme]. + /// + /// The [data] parameter must not be null. + const ElevatedButtonTheme({ + Key key, + @required this.data, + Widget child, + }) : assert(data != null), super(key: key, child: child); + + /// The configuration of this theme. + final ElevatedButtonThemeData data; + + /// The closest instance of this class that encloses the given context. + /// + /// If there is no enclosing [ElevatedButtonsTheme] widget, then + /// [ThemeData.ElevatedButtonTheme] is used. + /// + /// Typical usage is as follows: + /// + /// ```dart + /// ElevatedButtonTheme theme = ElevatedButtonTheme.of(context); + /// ``` + static ElevatedButtonThemeData of(BuildContext context) { + final ElevatedButtonTheme buttonTheme = context.dependOnInheritedWidgetOfExactType(); + return buttonTheme?.data ?? Theme.of(context).elevatedButtonTheme; + } + + @override + Widget wrap(BuildContext context, Widget child) { + final ElevatedButtonTheme ancestorTheme = context.findAncestorWidgetOfExactType(); + return identical(this, ancestorTheme) ? child : ElevatedButtonTheme(data: data, child: child); + } + + @override + bool updateShouldNotify(ElevatedButtonTheme oldWidget) => data != oldWidget.data; +} + + +/// Please use [ElevatedButtonTheme]. +@Deprecated( + 'This class was briefly released with the wrong name. ' + 'The correct name is ElevatedButtonThemeData. ' + 'This feature was deprecated after v1.20.0-2.0.pre.' +) +@immutable +class ContainedButtonThemeData extends ElevatedButtonThemeData { + /// Please use [new ElevatedButtonTheme]. + const ContainedButtonThemeData({ ButtonStyle style }) : super(style: style); + + /// Please use [ElevatedButtonTheme.lerp()]. + static ContainedButtonThemeData lerp(ContainedButtonThemeData a, ContainedButtonThemeData b, double t) { + return ElevatedButtonThemeData.lerp(a, b, t) as ContainedButtonThemeData; + } +} + +/// Please use [ElevatedButtonThemeData]. +@Deprecated( + 'This class was briefly released with the wrong name. ' + 'The correct name is ElevatedButtonTheme. ' + 'This feature was deprecated after v1.20.0-2.0.pre.' +) +class ContainedButtonTheme extends ElevatedButtonTheme { + /// Please use [new ElevatedButtonThemeData]. + const ContainedButtonTheme({ + Key key, + @required ContainedButtonThemeData data, + Widget child, + }) : assert(data != null), super(key: key, data: data, child: child); +} diff --git a/packages/flutter/lib/src/material/outlined_button.dart b/packages/flutter/lib/src/material/outlined_button.dart index 97d21a98624..90dc7c6bd0a 100644 --- a/packages/flutter/lib/src/material/outlined_button.dart +++ b/packages/flutter/lib/src/material/outlined_button.dart @@ -46,7 +46,7 @@ import 'theme_data.dart'; /// /// See also: /// -/// * [ContainedButton], a filled material design button with a shadow. +/// * [ElevatedButton], a filled material design button with a shadow. /// * [TextButton], a material design button without a shadow. /// * class OutlinedButton extends ButtonStyleButton { diff --git a/packages/flutter/lib/src/material/outlined_button_theme.dart b/packages/flutter/lib/src/material/outlined_button_theme.dart index 2c7117efb70..c5331e20057 100644 --- a/packages/flutter/lib/src/material/outlined_button_theme.dart +++ b/packages/flutter/lib/src/material/outlined_button_theme.dart @@ -23,7 +23,7 @@ import 'theme.dart'; /// /// * [OutlinedButtonTheme], the theme which is configured with this class. /// * [OutlinedButton.defaultStyleOf], which returns the default [ButtonStyle] -/// for text buttons. +/// for outlined buttons. /// * [OutlinedButton.styleOf], which converts simple values into a /// [ButtonStyle] that's consistent with [OutlinedButton]'s defaults. /// * [MaterialStateProperty.resolve], "resolve" a material state property @@ -83,7 +83,7 @@ class OutlinedButtonThemeData with Diagnosticable { /// /// * [OutlinedButtonThemeData], which is used to configure this theme. /// * [OutlinedButton.defaultStyleOf], which returns the default [ButtonStyle] -/// for text buttons. +/// for outlined buttons. /// * [OutlinedButton.styleOf], which converts simple values into a /// [ButtonStyle] that's consistent with [OutlinedButton]'s defaults. /// * [ThemeData.outlinedButtonTheme], which can be used to override the default diff --git a/packages/flutter/lib/src/material/text_button.dart b/packages/flutter/lib/src/material/text_button.dart index e2ff44effe1..c658fb750bd 100644 --- a/packages/flutter/lib/src/material/text_button.dart +++ b/packages/flutter/lib/src/material/text_button.dart @@ -54,7 +54,7 @@ import 'theme_data.dart'; /// See also: /// /// * [OutlinedButton], a [TextButton] with a border outline. -/// * [ContainedButton], a filled button whose material elevates when pressed. +/// * [ElevatedButton], a filled button whose material elevates when pressed. /// * class TextButton extends ButtonStyleButton { /// Create a TextButton. diff --git a/packages/flutter/lib/src/material/theme_data.dart b/packages/flutter/lib/src/material/theme_data.dart index 2f9d0401a34..ed75a7addb3 100644 --- a/packages/flutter/lib/src/material/theme_data.dart +++ b/packages/flutter/lib/src/material/theme_data.dart @@ -22,9 +22,9 @@ import 'card_theme.dart'; import 'chip_theme.dart'; import 'color_scheme.dart'; import 'colors.dart'; -import 'contained_button_theme.dart'; import 'dialog_theme.dart'; import 'divider_theme.dart'; +import 'elevated_button_theme.dart'; import 'floating_action_button_theme.dart'; import 'ink_splash.dart'; import 'ink_well.dart' show InteractiveInkFeatureFactory; @@ -276,7 +276,7 @@ class ThemeData with Diagnosticable { BottomNavigationBarThemeData bottomNavigationBarTheme, TimePickerThemeData timePickerTheme, TextButtonThemeData textButtonTheme, - ContainedButtonThemeData containedButtonTheme, + ElevatedButtonThemeData elevatedButtonTheme, OutlinedButtonThemeData outlinedButtonTheme, bool fixTextFieldOutlineLabel, }) { @@ -392,7 +392,7 @@ class ThemeData with Diagnosticable { bottomNavigationBarTheme ??= const BottomNavigationBarThemeData(); timePickerTheme ??= const TimePickerThemeData(); textButtonTheme ??= const TextButtonThemeData(); - containedButtonTheme ??= const ContainedButtonThemeData(); + elevatedButtonTheme ??= const ElevatedButtonThemeData(); outlinedButtonTheme ??= const OutlinedButtonThemeData(); fixTextFieldOutlineLabel ??= false; @@ -464,7 +464,7 @@ class ThemeData with Diagnosticable { bottomNavigationBarTheme: bottomNavigationBarTheme, timePickerTheme: timePickerTheme, textButtonTheme: textButtonTheme, - containedButtonTheme: containedButtonTheme, + elevatedButtonTheme: elevatedButtonTheme, outlinedButtonTheme: outlinedButtonTheme, fixTextFieldOutlineLabel: fixTextFieldOutlineLabel, ); @@ -548,7 +548,7 @@ class ThemeData with Diagnosticable { @required this.bottomNavigationBarTheme, @required this.timePickerTheme, @required this.textButtonTheme, - @required this.containedButtonTheme, + @required this.elevatedButtonTheme, @required this.outlinedButtonTheme, @required this.fixTextFieldOutlineLabel, }) : assert(visualDensity != null), @@ -615,7 +615,7 @@ class ThemeData with Diagnosticable { assert(bottomNavigationBarTheme != null), assert(timePickerTheme != null), assert(textButtonTheme != null), - assert(containedButtonTheme != null), + assert(elevatedButtonTheme != null), assert(outlinedButtonTheme != null), assert(fixTextFieldOutlineLabel != null); @@ -1086,8 +1086,8 @@ class ThemeData with Diagnosticable { final TextButtonThemeData textButtonTheme; /// A theme for customizing the appearance and internal layout of - /// [ContainedButton]s - final ContainedButtonThemeData containedButtonTheme; + /// [ElevatedButton]s + final ElevatedButtonThemeData elevatedButtonTheme; /// A theme for customizing the appearance and internal layout of /// [OutlinedButton]s. @@ -1177,7 +1177,7 @@ class ThemeData with Diagnosticable { BottomNavigationBarThemeData bottomNavigationBarTheme, TimePickerThemeData timePickerTheme, TextButtonThemeData textButtonTheme, - ContainedButtonThemeData containedButtonTheme, + ElevatedButtonThemeData elevatedButtonTheme, OutlinedButtonThemeData outlinedButtonTheme, bool fixTextFieldOutlineLabel, }) { @@ -1250,7 +1250,7 @@ class ThemeData with Diagnosticable { bottomNavigationBarTheme: bottomNavigationBarTheme ?? this.bottomNavigationBarTheme, timePickerTheme: timePickerTheme ?? this.timePickerTheme, textButtonTheme: textButtonTheme ?? this.textButtonTheme, - containedButtonTheme: containedButtonTheme ?? this.containedButtonTheme, + elevatedButtonTheme: elevatedButtonTheme ?? this.elevatedButtonTheme, outlinedButtonTheme: outlinedButtonTheme ?? this.outlinedButtonTheme, fixTextFieldOutlineLabel: fixTextFieldOutlineLabel ?? this.fixTextFieldOutlineLabel, ); @@ -1401,7 +1401,7 @@ class ThemeData with Diagnosticable { bottomNavigationBarTheme: BottomNavigationBarThemeData.lerp(a.bottomNavigationBarTheme, b.bottomNavigationBarTheme, t), timePickerTheme: TimePickerThemeData.lerp(a.timePickerTheme, b.timePickerTheme, t), textButtonTheme: TextButtonThemeData.lerp(a.textButtonTheme, b.textButtonTheme, t), - containedButtonTheme: ContainedButtonThemeData.lerp(a.containedButtonTheme, b.containedButtonTheme, t), + elevatedButtonTheme: ElevatedButtonThemeData.lerp(a.elevatedButtonTheme, b.elevatedButtonTheme, t), outlinedButtonTheme: OutlinedButtonThemeData.lerp(a.outlinedButtonTheme, b.outlinedButtonTheme, t), fixTextFieldOutlineLabel: t < 0.5 ? a.fixTextFieldOutlineLabel : b.fixTextFieldOutlineLabel, ); @@ -1480,7 +1480,7 @@ class ThemeData with Diagnosticable { && other.bottomNavigationBarTheme == bottomNavigationBarTheme && other.timePickerTheme == timePickerTheme && other.textButtonTheme == textButtonTheme - && other.containedButtonTheme == containedButtonTheme + && other.elevatedButtonTheme == elevatedButtonTheme && other.outlinedButtonTheme == outlinedButtonTheme && other.fixTextFieldOutlineLabel == fixTextFieldOutlineLabel; } @@ -1558,7 +1558,7 @@ class ThemeData with Diagnosticable { bottomNavigationBarTheme, timePickerTheme, textButtonTheme, - containedButtonTheme, + elevatedButtonTheme, outlinedButtonTheme, fixTextFieldOutlineLabel, ]; @@ -1633,7 +1633,7 @@ class ThemeData with Diagnosticable { properties.add(DiagnosticsProperty('timePickerTheme', timePickerTheme, defaultValue: defaultData.timePickerTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty('bottomNavigationBarTheme', bottomNavigationBarTheme, defaultValue: defaultData.bottomNavigationBarTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty('textButtonTheme', textButtonTheme, defaultValue: defaultData.textButtonTheme, level: DiagnosticLevel.debug)); - properties.add(DiagnosticsProperty('containedButtonTheme', containedButtonTheme, defaultValue: defaultData.containedButtonTheme, level: DiagnosticLevel.debug)); + properties.add(DiagnosticsProperty('elevatedButtonTheme', elevatedButtonTheme, defaultValue: defaultData.elevatedButtonTheme, level: DiagnosticLevel.debug)); properties.add(DiagnosticsProperty('outlinedButtonTheme', outlinedButtonTheme, defaultValue: defaultData.outlinedButtonTheme, level: DiagnosticLevel.debug)); } } diff --git a/packages/flutter/test/material/contained_button_test.dart b/packages/flutter/test/material/elevated_button_test.dart similarity index 87% rename from packages/flutter/test/material/contained_button_test.dart rename to packages/flutter/test/material/elevated_button_test.dart index 92be52f5e52..6572e605477 100644 --- a/packages/flutter/test/material/contained_button_test.dart +++ b/packages/flutter/test/material/elevated_button_test.dart @@ -13,20 +13,20 @@ import '../rendering/mock_canvas.dart'; import '../widgets/semantics_tester.dart'; void main() { - testWidgets('ContainedButton defaults', (WidgetTester tester) async { + testWidgets('ElevatedButton defaults', (WidgetTester tester) async { final Finder rawButtonMaterial = find.descendant( - of: find.byType(ContainedButton), + of: find.byType(ElevatedButton), matching: find.byType(Material), ); const ColorScheme colorScheme = ColorScheme.light(); - // Enabled ContainedButton + // Enabled ElevatedButton await tester.pumpWidget( MaterialApp( theme: ThemeData.from(colorScheme: colorScheme), home: Center( - child: ContainedButton( + child: ElevatedButton( onPressed: () { }, child: const Text('button'), ), @@ -49,7 +49,7 @@ void main() { expect(material.textStyle.fontWeight, FontWeight.w500); expect(material.type, MaterialType.button); - final Offset center = tester.getCenter(find.byType(ContainedButton)); + final Offset center = tester.getCenter(find.byType(ElevatedButton)); await tester.startGesture(center); await tester.pumpAndSettle(); @@ -69,12 +69,12 @@ void main() { expect(material.textStyle.fontWeight, FontWeight.w500); expect(material.type, MaterialType.button); - // Disabled ContainedButton + // Disabled ElevatedButton await tester.pumpWidget( MaterialApp( theme: ThemeData.from(colorScheme: colorScheme), home: const Center( - child: ContainedButton( + child: ElevatedButton( onPressed: null, child: Text('button'), ), @@ -98,7 +98,7 @@ void main() { expect(material.type, MaterialType.button); }); - testWidgets('Default ContainedButton meets a11y contrast guidelines', (WidgetTester tester) async { + testWidgets('Default ElevatedButton meets a11y contrast guidelines', (WidgetTester tester) async { final FocusNode focusNode = FocusNode(); await tester.pumpWidget( @@ -106,8 +106,8 @@ void main() { theme: ThemeData.from(colorScheme: const ColorScheme.light()), home: Scaffold( body: Center( - child: ContainedButton( - child: const Text('ContainedButton'), + child: ElevatedButton( + child: const Text('ElevatedButton'), onPressed: () { }, focusNode: focusNode, ), @@ -125,7 +125,7 @@ void main() { await expectLater(tester, meetsGuideline(textContrastGuideline)); // Hovered. - final Offset center = tester.getCenter(find.byType(ContainedButton)); + final Offset center = tester.getCenter(find.byType(ElevatedButton)); final TestGesture gesture = await tester.createGesture( kind: PointerDeviceKind.mouse, ); @@ -140,7 +140,7 @@ void main() { ); - testWidgets('ContainedButton uses stateful color for text color in different states', (WidgetTester tester) async { + testWidgets('ElevatedButton uses stateful color for text color in different states', (WidgetTester tester) async { final FocusNode focusNode = FocusNode(); const Color pressedColor = Color(0x00000001); @@ -165,16 +165,16 @@ void main() { MaterialApp( home: Scaffold( body: Center( - child: ContainedButtonTheme( - data: ContainedButtonThemeData( + child: ElevatedButtonTheme( + data: ElevatedButtonThemeData( style: ButtonStyle( foregroundColor: MaterialStateProperty.resolveWith(getTextColor), ), ), child: Builder( builder: (BuildContext context) { - return ContainedButton( - child: const Text('ContainedButton'), + return ElevatedButton( + child: const Text('ElevatedButton'), onPressed: () {}, focusNode: focusNode, ); @@ -187,7 +187,7 @@ void main() { ); Color textColor() { - return tester.renderObject(find.text('ContainedButton')).text.style.color; + return tester.renderObject(find.text('ElevatedButton')).text.style.color; } // Default, not disabled. @@ -199,7 +199,7 @@ void main() { expect(textColor(), focusedColor); // Hovered. - final Offset center = tester.getCenter(find.byType(ContainedButton)); + final Offset center = tester.getCenter(find.byType(ElevatedButton)); final TestGesture gesture = await tester.createGesture( kind: PointerDeviceKind.mouse, ); @@ -217,7 +217,7 @@ void main() { }); - testWidgets('ContainedButton uses stateful color for icon color in different states', (WidgetTester tester) async { + testWidgets('ElevatedButton uses stateful color for icon color in different states', (WidgetTester tester) async { final FocusNode focusNode = FocusNode(); final Key buttonKey = UniqueKey(); @@ -243,18 +243,18 @@ void main() { MaterialApp( home: Scaffold( body: Center( - child: ContainedButtonTheme( - data: ContainedButtonThemeData( + child: ElevatedButtonTheme( + data: ElevatedButtonThemeData( style: ButtonStyle( foregroundColor: MaterialStateProperty.resolveWith(getTextColor), ), ), child: Builder( builder: (BuildContext context) { - return ContainedButton.icon( + return ElevatedButton.icon( key: buttonKey, icon: const Icon(Icons.add), - label: const Text('ContainedButton'), + label: const Text('ElevatedButton'), onPressed: () {}, focusNode: focusNode, ); @@ -293,14 +293,14 @@ void main() { expect(iconColor(), pressedColor); }); - testWidgets('ContainedButton onPressed and onLongPress callbacks are correctly called when non-null', (WidgetTester tester) async { + testWidgets('ElevatedButton onPressed and onLongPress callbacks are correctly called when non-null', (WidgetTester tester) async { bool wasPressed; - Finder containedButton; + Finder elevatedButton; Widget buildFrame({ VoidCallback onPressed, VoidCallback onLongPress }) { return Directionality( textDirection: TextDirection.ltr, - child: ContainedButton( + child: ElevatedButton( child: const Text('button'), onPressed: onPressed, onLongPress: onLongPress, @@ -313,9 +313,9 @@ void main() { await tester.pumpWidget( buildFrame(onPressed: () { wasPressed = true; }, onLongPress: null), ); - containedButton = find.byType(ContainedButton); - expect(tester.widget(containedButton).enabled, true); - await tester.tap(containedButton); + elevatedButton = find.byType(ElevatedButton); + expect(tester.widget(elevatedButton).enabled, true); + await tester.tap(elevatedButton); expect(wasPressed, true); // onPressed null, onLongPress not null. @@ -323,27 +323,27 @@ void main() { await tester.pumpWidget( buildFrame(onPressed: null, onLongPress: () { wasPressed = true; }), ); - containedButton = find.byType(ContainedButton); - expect(tester.widget(containedButton).enabled, true); - await tester.longPress(containedButton); + elevatedButton = find.byType(ElevatedButton); + expect(tester.widget(elevatedButton).enabled, true); + await tester.longPress(elevatedButton); expect(wasPressed, true); // onPressed null, onLongPress null. await tester.pumpWidget( buildFrame(onPressed: null, onLongPress: null), ); - containedButton = find.byType(ContainedButton); - expect(tester.widget(containedButton).enabled, false); + elevatedButton = find.byType(ElevatedButton); + expect(tester.widget(elevatedButton).enabled, false); }); - testWidgets('ContainedButton onPressed and onLongPress callbacks are distinctly recognized', (WidgetTester tester) async { + testWidgets('ElevatedButton onPressed and onLongPress callbacks are distinctly recognized', (WidgetTester tester) async { bool didPressButton = false; bool didLongPressButton = false; await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, - child: ContainedButton( + child: ElevatedButton( onPressed: () { didPressButton = true; }, @@ -355,25 +355,25 @@ void main() { ), ); - final Finder containedButton = find.byType(ContainedButton); - expect(tester.widget(containedButton).enabled, true); + final Finder elevatedButton = find.byType(ElevatedButton); + expect(tester.widget(elevatedButton).enabled, true); expect(didPressButton, isFalse); - await tester.tap(containedButton); + await tester.tap(elevatedButton); expect(didPressButton, isTrue); expect(didLongPressButton, isFalse); - await tester.longPress(containedButton); + await tester.longPress(elevatedButton); expect(didLongPressButton, isTrue); }); - testWidgets('Does ContainedButton work with hover', (WidgetTester tester) async { + testWidgets('Does ElevatedButton work with hover', (WidgetTester tester) async { const Color hoverColor = Color(0xff001122); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, - child: ContainedButton( + child: ElevatedButton( style: ButtonStyle( overlayColor: MaterialStateProperty.resolveWith((Set states) { return states.contains(MaterialState.hovered) ? hoverColor : null; @@ -387,7 +387,7 @@ void main() { final TestGesture gesture = await tester.createGesture(kind: PointerDeviceKind.mouse); await gesture.addPointer(); - await gesture.moveTo(tester.getCenter(find.byType(ContainedButton))); + await gesture.moveTo(tester.getCenter(find.byType(ElevatedButton))); await tester.pumpAndSettle(); final RenderObject inkFeatures = tester.allRenderObjects.firstWhere((RenderObject object) => object.runtimeType.toString() == '_RenderInkFeatures'); @@ -396,14 +396,14 @@ void main() { await gesture.removePointer(); }); - testWidgets('Does ContainedButton work with focus', (WidgetTester tester) async { + testWidgets('Does ElevatedButton work with focus', (WidgetTester tester) async { const Color focusColor = Color(0xff001122); - final FocusNode focusNode = FocusNode(debugLabel: 'ContainedButton Node'); + final FocusNode focusNode = FocusNode(debugLabel: 'ElevatedButton Node'); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, - child: ContainedButton( + child: ElevatedButton( style: ButtonStyle( overlayColor: MaterialStateProperty.resolveWith((Set states) { return states.contains(MaterialState.focused) ? focusColor : null; @@ -424,18 +424,18 @@ void main() { expect(inkFeatures, paints..rect(color: focusColor)); }); - testWidgets('Does ContainedButton work with autofocus', (WidgetTester tester) async { + testWidgets('Does ElevatedButton work with autofocus', (WidgetTester tester) async { const Color focusColor = Color(0xff001122); Color getOverlayColor(Set states) { return states.contains(MaterialState.focused) ? focusColor : null; } - final FocusNode focusNode = FocusNode(debugLabel: 'ContainedButton Node'); + final FocusNode focusNode = FocusNode(debugLabel: 'ElevatedButton Node'); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, - child: ContainedButton( + child: ElevatedButton( autofocus: true, style: ButtonStyle( overlayColor: MaterialStateProperty.resolveWith(getOverlayColor), @@ -454,14 +454,14 @@ void main() { expect(inkFeatures, paints..rect(color: focusColor)); }); - testWidgets('Does ContainedButton contribute semantics', (WidgetTester tester) async { + testWidgets('Does ElevatedButton contribute semantics', (WidgetTester tester) async { final SemanticsTester semantics = SemanticsTester(tester); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Material( child: Center( - child: ContainedButton( + child: ElevatedButton( style: ButtonStyle( // Specifying minimumSize to mimic the original minimumSize for // RaisedButton so that the semantics tree's rect and transform @@ -501,7 +501,7 @@ void main() { semantics.dispose(); }); - testWidgets('ContainedButton size is configurable by ThemeData.materialTapTargetSize', (WidgetTester tester) async { + testWidgets('ElevatedButton size is configurable by ThemeData.materialTapTargetSize', (WidgetTester tester) async { final ButtonStyle style = ButtonStyle( // Specifying minimumSize to mimic the original minimumSize for // RaisedButton so that the corresponding button size matches @@ -516,7 +516,7 @@ void main() { textDirection: TextDirection.ltr, child: Material( child: Center( - child: ContainedButton( + child: ElevatedButton( key: key, style: style, child: const SizedBox(width: 50.0, height: 8.0), @@ -537,12 +537,12 @@ void main() { expect(tester.getSize(find.byKey(key2)), const Size(88.0, 36.0)); }); - testWidgets('ContainedButton has no clip by default', (WidgetTester tester) async { + testWidgets('ElevatedButton has no clip by default', (WidgetTester tester) async { await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: Material( - child: ContainedButton( + child: ElevatedButton( onPressed: () { /* to make sure the button is enabled */ }, child: const Text('button'), ), @@ -551,12 +551,12 @@ void main() { ); expect( - tester.renderObject(find.byType(ContainedButton)), + tester.renderObject(find.byType(ElevatedButton)), paintsExactlyCountTimes(#clipPath, 0), ); }); - testWidgets('ContainedButton responds to density changes.', (WidgetTester tester) async { + testWidgets('ElevatedButton responds to density changes.', (WidgetTester tester) async { const Key key = Key('test'); const Key childKey = Key('test child'); @@ -566,7 +566,7 @@ void main() { home: Directionality( textDirection: TextDirection.rtl, child: Center( - child: ContainedButton( + child: ElevatedButton( style: ButtonStyle( visualDensity: visualDensity, // Specifying minimumSize to mimic the original minimumSize for @@ -624,7 +624,7 @@ void main() { expect(childRect, equals(const Rect.fromLTRB(372.0, 293.0, 428.0, 307.0))); }); - testWidgets('ContainedButton.icon responds to applied padding', (WidgetTester tester) async { + testWidgets('ElevatedButton.icon responds to applied padding', (WidgetTester tester) async { const Key buttonKey = Key('test'); const Key labelKey = Key('label'); await tester.pumpWidget( @@ -635,7 +635,7 @@ void main() { textDirection: TextDirection.ltr, child: Material( child: Center( - child: ContainedButton.icon( + child: ElevatedButton.icon( key: buttonKey, style: ButtonStyle( padding: MaterialStateProperty.all(const EdgeInsets.fromLTRB(16, 5, 10, 12)), @@ -666,7 +666,7 @@ void main() { expect(paddingRect.bottom, tallerWidget.bottom + 12); }); - group('Default ContainedButton padding for textScaleFactor, textDirection', () { + group('Default ElevatedButton padding for textScaleFactor, textDirection', () { const ValueKey buttonKey = ValueKey('button'); const ValueKey labelKey = ValueKey('label'); const ValueKey iconKey = ValueKey('icon'); @@ -746,7 +746,7 @@ void main() { for (final double textScaleFactor in textScaleFactorOptions) { for (final TextDirection textDirection in textDirectionOptions) { for (final Widget icon in iconOptions) { - final String testName = 'ContainedButton' + final String testName = 'ElevatedButton' ', text scale $textScaleFactor' '${icon != null ? ", with icon" : ""}' '${textDirection == TextDirection.rtl ? ", RTL" : ""}'; @@ -766,12 +766,12 @@ void main() { child: Scaffold( body: Center( child: icon == null - ? ContainedButton( + ? ElevatedButton( key: buttonKey, onPressed: () {}, child: const Text('button', key: labelKey), ) - : ContainedButton.icon( + : ElevatedButton.icon( key: buttonKey, onPressed: () {}, icon: icon, @@ -887,7 +887,7 @@ void main() { } }); - testWidgets('Override ContainedButton default padding', (WidgetTester tester) async { + testWidgets('Override ElevatedButton default padding', (WidgetTester tester) async { await tester.pumpWidget( MaterialApp( theme: ThemeData.from(colorScheme: const ColorScheme.light()), @@ -899,10 +899,10 @@ void main() { ), child: Scaffold( body: Center( - child: ContainedButton( - style: ContainedButton.styleFrom(padding: const EdgeInsets.all(22)), + child: ElevatedButton( + style: ElevatedButton.styleFrom(padding: const EdgeInsets.all(22)), onPressed: () {}, - child: const Text('ContainedButton') + child: const Text('ElevatedButton') ), ), ), @@ -914,7 +914,7 @@ void main() { final Padding paddingWidget = tester.widget( find.descendant( - of: find.byType(ContainedButton), + of: find.byType(ElevatedButton), matching: find.byType(Padding), ), ); diff --git a/packages/flutter/test/material/contained_button_theme_test.dart b/packages/flutter/test/material/elevated_button_theme_test.dart similarity index 89% rename from packages/flutter/test/material/contained_button_theme_test.dart rename to packages/flutter/test/material/elevated_button_theme_test.dart index 284dde9eabe..c68ce4e9aab 100644 --- a/packages/flutter/test/material/contained_button_theme_test.dart +++ b/packages/flutter/test/material/elevated_button_theme_test.dart @@ -9,14 +9,14 @@ import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { - testWidgets('Passing no ContainedButtonTheme returns defaults', (WidgetTester tester) async { + testWidgets('Passing no ElevatedButtonTheme returns defaults', (WidgetTester tester) async { const ColorScheme colorScheme = ColorScheme.light(); await tester.pumpWidget( MaterialApp( theme: ThemeData.from(colorScheme: colorScheme), home: Scaffold( body: Center( - child: ContainedButton( + child: ElevatedButton( onPressed: () { }, child: const Text('button'), ), @@ -26,7 +26,7 @@ void main() { ); final Finder buttonMaterial = find.descendant( - of: find.byType(ContainedButton), + of: find.byType(ElevatedButton), matching: find.byType(Material), ); @@ -43,7 +43,7 @@ void main() { expect(material.textStyle.fontWeight, FontWeight.w500); }); - group('[Theme, TextTheme, ContainedButton style overrides]', () { + group('[Theme, TextTheme, ElevatedButton style overrides]', () { const Color primaryColor = Color(0xff000001); const Color onSurfaceColor = Color(0xff000002); const Color shadowColor = Color(0xff000004); @@ -60,7 +60,7 @@ void main() { const Duration animationDuration = Duration(milliseconds: 25); const bool enableFeedback = false; - final ButtonStyle style = ContainedButton.styleFrom( + final ButtonStyle style = ElevatedButton.styleFrom( primary: primaryColor, onPrimary: onPrimaryColor, onSurface: onSurfaceColor, @@ -81,7 +81,7 @@ void main() { Widget buildFrame({ ButtonStyle buttonStyle, ButtonStyle themeStyle, ButtonStyle overallStyle }) { final Widget child = Builder( builder: (BuildContext context) { - return ContainedButton( + return ElevatedButton( style: buttonStyle, onPressed: () { }, child: const Text('button'), @@ -90,14 +90,14 @@ void main() { ); return MaterialApp( theme: ThemeData.from(colorScheme: const ColorScheme.light()).copyWith( - containedButtonTheme: ContainedButtonThemeData(style: overallStyle), + elevatedButtonTheme: ElevatedButtonThemeData(style: overallStyle), ), home: Scaffold( body: Center( - // If the ContainedButtonTheme widget is present, it's used - // instead of the Theme's ThemeData.containedButtonTheme. - child: themeStyle == null ? child : ContainedButtonTheme( - data: ContainedButtonThemeData(style: themeStyle), + // If the ElevatedButtonTheme widget is present, it's used + // instead of the Theme's ThemeData.ElevatedButtonTheme. + child: themeStyle == null ? child : ElevatedButtonTheme( + data: ElevatedButtonThemeData(style: themeStyle), child: child, ), ), @@ -106,12 +106,12 @@ void main() { } final Finder findMaterial = find.descendant( - of: find.byType(ContainedButton), + of: find.byType(ElevatedButton), matching: find.byType(Material), ); final Finder findInkWell = find.descendant( - of: find.byType(ContainedButton), + of: find.byType(ElevatedButton), matching: find.byType(InkWell), ); @@ -138,7 +138,7 @@ void main() { expect(material.borderRadius, null); expect(material.shape, shape); expect(material.animationDuration, animationDuration); - expect(tester.getSize(find.byType(ContainedButton)), const Size(200, 200)); + expect(tester.getSize(find.byType(ElevatedButton)), const Size(200, 200)); } testWidgets('Button style overrides defaults', (WidgetTester tester) async { diff --git a/packages/flutter/test/material/theme_data_test.dart b/packages/flutter/test/material/theme_data_test.dart index 63376aaba08..f1d37023cdf 100644 --- a/packages/flutter/test/material/theme_data_test.dart +++ b/packages/flutter/test/material/theme_data_test.dart @@ -285,7 +285,7 @@ void main() { bottomNavigationBarTheme: const BottomNavigationBarThemeData(type: BottomNavigationBarType.fixed), timePickerTheme: const TimePickerThemeData(backgroundColor: Colors.black), textButtonTheme: TextButtonThemeData(style: TextButton.styleFrom(primary: Colors.red)), - containedButtonTheme: ContainedButtonThemeData(style: ContainedButton.styleFrom(primary: Colors.green)), + elevatedButtonTheme: ElevatedButtonThemeData(style: ElevatedButton.styleFrom(primary: Colors.green)), outlinedButtonTheme: OutlinedButtonThemeData(style: OutlinedButton.styleFrom(primary: Colors.blue)), fixTextFieldOutlineLabel: false, ); @@ -371,7 +371,7 @@ void main() { bottomNavigationBarTheme: const BottomNavigationBarThemeData(type: BottomNavigationBarType.shifting), timePickerTheme: const TimePickerThemeData(backgroundColor: Colors.white), textButtonTheme: const TextButtonThemeData(), - containedButtonTheme: const ContainedButtonThemeData(), + elevatedButtonTheme: const ElevatedButtonThemeData(), outlinedButtonTheme: const OutlinedButtonThemeData(), fixTextFieldOutlineLabel: true, ); @@ -443,7 +443,7 @@ void main() { bottomNavigationBarTheme: otherTheme.bottomNavigationBarTheme, timePickerTheme: otherTheme.timePickerTheme, textButtonTheme: otherTheme.textButtonTheme, - containedButtonTheme: otherTheme.containedButtonTheme, + elevatedButtonTheme: otherTheme.elevatedButtonTheme, outlinedButtonTheme: otherTheme.outlinedButtonTheme, fixTextFieldOutlineLabel: otherTheme.fixTextFieldOutlineLabel, ); @@ -514,7 +514,7 @@ void main() { expect(themeDataCopy.bottomNavigationBarTheme, equals(otherTheme.bottomNavigationBarTheme)); expect(themeDataCopy.timePickerTheme, equals(otherTheme.timePickerTheme)); expect(themeDataCopy.textButtonTheme, equals(otherTheme.textButtonTheme)); - expect(themeDataCopy.containedButtonTheme, equals(otherTheme.containedButtonTheme)); + expect(themeDataCopy.elevatedButtonTheme, equals(otherTheme.elevatedButtonTheme)); expect(themeDataCopy.outlinedButtonTheme, equals(otherTheme.outlinedButtonTheme)); expect(themeDataCopy.fixTextFieldOutlineLabel, equals(otherTheme.fixTextFieldOutlineLabel)); });