Unverified Commit e3f8ee88 authored by Casey Hillers's avatar Casey Hillers Committed by GitHub

Revert "Update `MaterialBanner` to support Material 3" (#111288)

parent bd73a6a3
...@@ -17,17 +17,16 @@ ...@@ -17,17 +17,16 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:gen_defaults/action_chip_template.dart';
import 'package:gen_defaults/app_bar_template.dart'; import 'package:gen_defaults/app_bar_template.dart';
import 'package:gen_defaults/banner_template.dart';
import 'package:gen_defaults/button_template.dart'; import 'package:gen_defaults/button_template.dart';
import 'package:gen_defaults/card_template.dart'; import 'package:gen_defaults/card_template.dart';
import 'package:gen_defaults/checkbox_template.dart'; import 'package:gen_defaults/checkbox_template.dart';
import 'package:gen_defaults/chip_action_template.dart';
import 'package:gen_defaults/chip_filter_template.dart';
import 'package:gen_defaults/chip_input_template.dart';
import 'package:gen_defaults/dialog_template.dart'; import 'package:gen_defaults/dialog_template.dart';
import 'package:gen_defaults/fab_template.dart'; import 'package:gen_defaults/fab_template.dart';
import 'package:gen_defaults/filter_chip_template.dart';
import 'package:gen_defaults/icon_button_template.dart'; import 'package:gen_defaults/icon_button_template.dart';
import 'package:gen_defaults/input_chip_template.dart';
import 'package:gen_defaults/input_decorator_template.dart'; import 'package:gen_defaults/input_decorator_template.dart';
import 'package:gen_defaults/navigation_bar_template.dart'; import 'package:gen_defaults/navigation_bar_template.dart';
import 'package:gen_defaults/navigation_rail_template.dart'; import 'package:gen_defaults/navigation_rail_template.dart';
...@@ -104,7 +103,6 @@ Future<void> main(List<String> args) async { ...@@ -104,7 +103,6 @@ Future<void> main(List<String> args) async {
tokens['colorsDark'] = _readTokenFile('color_dark.json'); tokens['colorsDark'] = _readTokenFile('color_dark.json');
AppBarTemplate('AppBar', '$materialLib/app_bar.dart', tokens).updateFile(); AppBarTemplate('AppBar', '$materialLib/app_bar.dart', tokens).updateFile();
BannerTemplate('Banner', '$materialLib/banner.dart', tokens).updateFile();
ButtonTemplate('md.comp.elevated-button', 'ElevatedButton', '$materialLib/elevated_button.dart', tokens).updateFile(); ButtonTemplate('md.comp.elevated-button', 'ElevatedButton', '$materialLib/elevated_button.dart', tokens).updateFile();
ButtonTemplate('md.comp.filled-button', 'FilledButton', '$materialLib/filled_button.dart', tokens).updateFile(); ButtonTemplate('md.comp.filled-button', 'FilledButton', '$materialLib/filled_button.dart', tokens).updateFile();
ButtonTemplate('md.comp.filled-tonal-button', 'FilledTonalButton', '$materialLib/filled_button.dart', tokens).updateFile(); ButtonTemplate('md.comp.filled-tonal-button', 'FilledTonalButton', '$materialLib/filled_button.dart', tokens).updateFile();
...@@ -112,10 +110,10 @@ Future<void> main(List<String> args) async { ...@@ -112,10 +110,10 @@ Future<void> main(List<String> args) async {
ButtonTemplate('md.comp.text-button', 'TextButton', '$materialLib/text_button.dart', tokens).updateFile(); ButtonTemplate('md.comp.text-button', 'TextButton', '$materialLib/text_button.dart', tokens).updateFile();
CardTemplate('Card', '$materialLib/card.dart', tokens).updateFile(); CardTemplate('Card', '$materialLib/card.dart', tokens).updateFile();
CheckboxTemplate('Checkbox', '$materialLib/checkbox.dart', tokens).updateFile(); CheckboxTemplate('Checkbox', '$materialLib/checkbox.dart', tokens).updateFile();
ChipActionTemplate('ActionChip', '$materialLib/action_chip.dart', tokens).updateFile(); ChipActionTemplate('ActionChip', '$materialLib/chip_action.dart', tokens).updateFile();
ChipFilterTemplate('FilterChip', '$materialLib/filter_chip.dart', tokens).updateFile(); ChipFilterTemplate('FilterChip', '$materialLib/chip_filter.dart', tokens).updateFile();
ChipFilterTemplate('FilterChip', '$materialLib/choice_chip.dart', tokens).updateFile(); ChipFilterTemplate('FilterChip', '$materialLib/chip_choice.dart', tokens).updateFile();
ChipInputTemplate('InputChip', '$materialLib/input_chip.dart', tokens).updateFile(); ChipInputTemplate('InputChip', '$materialLib/chip_input.dart', tokens).updateFile();
DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile(); DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile();
FABTemplate('FAB', '$materialLib/floating_action_button.dart', tokens).updateFile(); FABTemplate('FAB', '$materialLib/floating_action_button.dart', tokens).updateFile();
IconButtonTemplate('IconButton', '$materialLib/icon_button.dart', tokens).updateFile(); IconButtonTemplate('IconButton', '$materialLib/icon_button.dart', tokens).updateFile();
......
// 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 'template.dart';
class BannerTemplate extends TokenTemplate {
const BannerTemplate(super.blockName, super.fileName, super.tokens);
@override
String generate() => '''
class _${blockName}DefaultsM3 extends MaterialBannerThemeData {
const _${blockName}DefaultsM3(this.context)
: super(elevation: ${elevation("md.comp.banner.container")});
final BuildContext context;
@override
Color? get backgroundColor => ${componentColor("md.comp.banner.container")};
@override
Color? get surfaceTintColor => ${color("md.comp.banner.container.surface-tint-layer.color")};
@override
Color? get dividerColor => ${color("md.comp.banner.divider.color")};
@override
TextStyle? get contentTextStyle => ${textStyle("md.comp.banner.supporting-text")};
}
''';
}
...@@ -102,15 +102,12 @@ class MaterialBanner extends StatefulWidget { ...@@ -102,15 +102,12 @@ class MaterialBanner extends StatefulWidget {
this.elevation, this.elevation,
this.leading, this.leading,
this.backgroundColor, this.backgroundColor,
this.surfaceTintColor,
this.shadowColor,
this.dividerColor,
this.padding, this.padding,
this.leadingPadding, this.leadingPadding,
this.forceActionsBelow = false, this.forceActionsBelow = false,
this.overflowAlignment = OverflowBarAlignment.end, this.overflowAlignment = OverflowBarAlignment.end,
this.animation, this.animation,
this.onVisible, this.onVisible
}) : assert(elevation == null || elevation >= 0.0), }) : assert(elevation == null || elevation >= 0.0),
assert(content != null), assert(content != null),
assert(actions != null), assert(actions != null),
...@@ -156,29 +153,6 @@ class MaterialBanner extends StatefulWidget { ...@@ -156,29 +153,6 @@ class MaterialBanner extends StatefulWidget {
/// also `null`, [ColorScheme.surface] of [ThemeData.colorScheme] is used. /// also `null`, [ColorScheme.surface] of [ThemeData.colorScheme] is used.
final Color? backgroundColor; final Color? backgroundColor;
/// The color used as an overlay on [backgroundColor] to indicate elevation.
///
/// If null, [MaterialBannerThemeData.surfaceTintColor] is used. If that
/// is also null, the default value is [ColorScheme.surfaceTint].
///
/// See [Material.surfaceTintColor] for more details on how this
/// overlay is applied.
final Color? surfaceTintColor;
/// The color of the shadow below the [MaterialBanner].
///
/// If this property is null, then [MaterialBannerThemeData.shadowColor] of
/// [ThemeData.bannerTheme] is used. If that is also null, the default value
/// is null.
final Color? shadowColor;
/// The color of the divider.
///
/// If this property is null, then [MaterialBannerThemeData.dividerColor] of
/// [ThemeData.bannerTheme] is used. If that is also null, the default value
/// is [ColorScheme.surfaceVariant].
final Color? dividerColor;
/// The amount of space by which to inset the [content]. /// The amount of space by which to inset the [content].
/// ///
/// If the [actions] are below the [content], this defaults to /// If the [actions] are below the [content], this defaults to
...@@ -299,7 +273,6 @@ class _MaterialBannerState extends State<MaterialBanner> { ...@@ -299,7 +273,6 @@ class _MaterialBannerState extends State<MaterialBanner> {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
final MaterialBannerThemeData bannerTheme = MaterialBannerTheme.of(context); final MaterialBannerThemeData bannerTheme = MaterialBannerTheme.of(context);
final MaterialBannerThemeData defaults = theme.useMaterial3 ? _BannerDefaultsM3(context) : _BannerDefaultsM2(context);
final bool isSingleRow = widget.actions.length == 1 && !widget.forceActionsBelow; final bool isSingleRow = widget.actions.length == 1 && !widget.forceActionsBelow;
final EdgeInsetsGeometry padding = widget.padding ?? bannerTheme.padding ?? (isSingleRow final EdgeInsetsGeometry padding = widget.padding ?? bannerTheme.padding ?? (isSingleRow
...@@ -323,26 +296,16 @@ class _MaterialBannerState extends State<MaterialBanner> { ...@@ -323,26 +296,16 @@ class _MaterialBannerState extends State<MaterialBanner> {
final double elevation = widget.elevation ?? bannerTheme.elevation ?? 0.0; final double elevation = widget.elevation ?? bannerTheme.elevation ?? 0.0;
final Color backgroundColor = widget.backgroundColor final Color backgroundColor = widget.backgroundColor
?? bannerTheme.backgroundColor ?? bannerTheme.backgroundColor
?? defaults.backgroundColor!; ?? theme.colorScheme.surface;
final Color? surfaceTintColor = widget.surfaceTintColor
?? bannerTheme.surfaceTintColor
?? defaults.surfaceTintColor;
final Color? shadowColor = widget.shadowColor
?? bannerTheme.shadowColor;
final Color? dividerColor = widget.dividerColor
?? bannerTheme.dividerColor
?? defaults.dividerColor;
final TextStyle? textStyle = widget.contentTextStyle final TextStyle? textStyle = widget.contentTextStyle
?? bannerTheme.contentTextStyle ?? bannerTheme.contentTextStyle
?? defaults.contentTextStyle; ?? theme.textTheme.bodyMedium;
Widget materialBanner = Container( Widget materialBanner = Container(
margin: EdgeInsets.only(bottom: elevation > 0 ? 10.0 : 0.0), margin: EdgeInsets.only(bottom: elevation > 0 ? 10.0 : 0.0),
child: Material( child: Material(
elevation: elevation, elevation: elevation,
color: backgroundColor, color: backgroundColor,
surfaceTintColor: surfaceTintColor,
shadowColor: shadowColor,
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
...@@ -368,8 +331,9 @@ class _MaterialBannerState extends State<MaterialBanner> { ...@@ -368,8 +331,9 @@ class _MaterialBannerState extends State<MaterialBanner> {
), ),
if (!isSingleRow) if (!isSingleRow)
buttonBar, buttonBar,
if (elevation == 0) if (elevation == 0)
Divider(height: 0, color: dividerColor), const Divider(height: 0),
], ],
), ),
), ),
...@@ -430,51 +394,3 @@ class _MaterialBannerState extends State<MaterialBanner> { ...@@ -430,51 +394,3 @@ class _MaterialBannerState extends State<MaterialBanner> {
); );
} }
} }
class _BannerDefaultsM2 extends MaterialBannerThemeData {
_BannerDefaultsM2(this.context)
: _theme = Theme.of(context),
super(elevation: 0.0);
final BuildContext context;
final ThemeData _theme;
@override
Color? get backgroundColor => _theme.colorScheme.surface;
@override
Color? get dividerColor => Theme.of(context).colorScheme.surfaceVariant;
@override
TextStyle? get contentTextStyle => _theme.textTheme.bodyText2;
}
// BEGIN GENERATED TOKEN PROPERTIES - Banner
// Do not edit by hand. The code between the "BEGIN GENERATED" and
// "END GENERATED" comments are generated from data in the Material
// Design token database by the script:
// dev/tools/gen_defaults/bin/gen_defaults.dart.
// Token database version: v0_101
class _BannerDefaultsM3 extends MaterialBannerThemeData {
const _BannerDefaultsM3(this.context)
: super(elevation: 1.0);
final BuildContext context;
@override
Color? get backgroundColor => Theme.of(context).colorScheme.surface;
@override
Color? get surfaceTintColor => Theme.of(context).colorScheme.surfaceTint;
@override
Color? get dividerColor => Theme.of(context).colorScheme.surfaceVariant;
@override
TextStyle? get contentTextStyle => Theme.of(context).textTheme.bodyMedium;
}
// END GENERATED TOKEN PROPERTIES - Banner
...@@ -35,9 +35,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -35,9 +35,6 @@ class MaterialBannerThemeData with Diagnosticable {
/// [ThemeData.bannerTheme]. /// [ThemeData.bannerTheme].
const MaterialBannerThemeData({ const MaterialBannerThemeData({
this.backgroundColor, this.backgroundColor,
this.surfaceTintColor,
this.shadowColor,
this.dividerColor,
this.contentTextStyle, this.contentTextStyle,
this.elevation, this.elevation,
this.padding, this.padding,
...@@ -47,15 +44,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -47,15 +44,6 @@ class MaterialBannerThemeData with Diagnosticable {
/// The background color of a [MaterialBanner]. /// The background color of a [MaterialBanner].
final Color? backgroundColor; final Color? backgroundColor;
/// Overrides the default value of [MaterialBanner.surfaceTintColor].
final Color? surfaceTintColor;
/// Overrides the default value of [MaterialBanner.shadowColor].
final Color? shadowColor;
/// Overrides the default value of [MaterialBanner.dividerColor].
final Color? dividerColor;
/// Used to configure the [DefaultTextStyle] for the [MaterialBanner.content] /// Used to configure the [DefaultTextStyle] for the [MaterialBanner.content]
/// widget. /// widget.
final TextStyle? contentTextStyle; final TextStyle? contentTextStyle;
...@@ -75,9 +63,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -75,9 +63,6 @@ class MaterialBannerThemeData with Diagnosticable {
/// new values. /// new values.
MaterialBannerThemeData copyWith({ MaterialBannerThemeData copyWith({
Color? backgroundColor, Color? backgroundColor,
Color? surfaceTintColor,
Color? shadowColor,
Color? dividerColor,
TextStyle? contentTextStyle, TextStyle? contentTextStyle,
double? elevation, double? elevation,
EdgeInsetsGeometry? padding, EdgeInsetsGeometry? padding,
...@@ -85,9 +70,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -85,9 +70,6 @@ class MaterialBannerThemeData with Diagnosticable {
}) { }) {
return MaterialBannerThemeData( return MaterialBannerThemeData(
backgroundColor: backgroundColor ?? this.backgroundColor, backgroundColor: backgroundColor ?? this.backgroundColor,
surfaceTintColor: surfaceTintColor ?? this.surfaceTintColor,
shadowColor: shadowColor ?? this.shadowColor,
dividerColor: dividerColor ?? this.dividerColor,
contentTextStyle: contentTextStyle ?? this.contentTextStyle, contentTextStyle: contentTextStyle ?? this.contentTextStyle,
elevation: elevation ?? this.elevation, elevation: elevation ?? this.elevation,
padding: padding ?? this.padding, padding: padding ?? this.padding,
...@@ -104,9 +86,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -104,9 +86,6 @@ class MaterialBannerThemeData with Diagnosticable {
assert(t != null); assert(t != null);
return MaterialBannerThemeData( return MaterialBannerThemeData(
backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t), backgroundColor: Color.lerp(a?.backgroundColor, b?.backgroundColor, t),
surfaceTintColor: Color.lerp(a?.surfaceTintColor, b?.surfaceTintColor, t),
shadowColor: Color.lerp(a?.shadowColor, b?.shadowColor, t),
dividerColor: Color.lerp(a?.dividerColor, b?.dividerColor, t),
contentTextStyle: TextStyle.lerp(a?.contentTextStyle, b?.contentTextStyle, t), contentTextStyle: TextStyle.lerp(a?.contentTextStyle, b?.contentTextStyle, t),
elevation: lerpDouble(a?.elevation, b?.elevation, t), elevation: lerpDouble(a?.elevation, b?.elevation, t),
padding: EdgeInsetsGeometry.lerp(a?.padding, b?.padding, t), padding: EdgeInsetsGeometry.lerp(a?.padding, b?.padding, t),
...@@ -117,9 +96,6 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -117,9 +96,6 @@ class MaterialBannerThemeData with Diagnosticable {
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
backgroundColor, backgroundColor,
surfaceTintColor,
shadowColor,
dividerColor,
contentTextStyle, contentTextStyle,
elevation, elevation,
padding, padding,
...@@ -135,25 +111,19 @@ class MaterialBannerThemeData with Diagnosticable { ...@@ -135,25 +111,19 @@ class MaterialBannerThemeData with Diagnosticable {
return false; return false;
} }
return other is MaterialBannerThemeData return other is MaterialBannerThemeData
&& other.backgroundColor == backgroundColor && other.backgroundColor == backgroundColor
&& other.surfaceTintColor == surfaceTintColor && other.contentTextStyle == contentTextStyle
&& other.shadowColor == shadowColor && other.elevation == elevation
&& other.dividerColor == dividerColor && other.padding == padding
&& other.contentTextStyle == contentTextStyle && other.leadingPadding == leadingPadding;
&& other.elevation == elevation
&& other.padding == padding
&& other.leadingPadding == leadingPadding;
} }
@override @override
void debugFillProperties(DiagnosticPropertiesBuilder properties) { void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties); super.debugFillProperties(properties);
properties.add(ColorProperty('backgroundColor', backgroundColor, defaultValue: null)); properties.add(ColorProperty('backgroundColor', backgroundColor, defaultValue: null));
properties.add(ColorProperty('surfaceTintColor', surfaceTintColor, defaultValue: null));
properties.add(ColorProperty('shadowColor', shadowColor, defaultValue: null));
properties.add(ColorProperty('dividerColor', dividerColor, defaultValue: null));
properties.add(DiagnosticsProperty<TextStyle>('contentTextStyle', contentTextStyle, defaultValue: null)); properties.add(DiagnosticsProperty<TextStyle>('contentTextStyle', contentTextStyle, defaultValue: null));
properties.add(DoubleProperty('elevation', elevation, defaultValue: null)); properties.add(DiagnosticsProperty<double>('elevation', elevation, defaultValue: null));
properties.add(DiagnosticsProperty<EdgeInsetsGeometry>('padding', padding, defaultValue: null)); properties.add(DiagnosticsProperty<EdgeInsetsGeometry>('padding', padding, defaultValue: null));
properties.add(DiagnosticsProperty<EdgeInsetsGeometry>('leadingPadding', leadingPadding, defaultValue: null)); properties.add(DiagnosticsProperty<EdgeInsetsGeometry>('leadingPadding', leadingPadding, defaultValue: null));
} }
......
...@@ -15,13 +15,7 @@ void main() { ...@@ -15,13 +15,7 @@ void main() {
test('MaterialBannerThemeData null fields by default', () { test('MaterialBannerThemeData null fields by default', () {
const MaterialBannerThemeData bannerTheme = MaterialBannerThemeData(); const MaterialBannerThemeData bannerTheme = MaterialBannerThemeData();
expect(bannerTheme.backgroundColor, null); expect(bannerTheme.backgroundColor, null);
expect(bannerTheme.surfaceTintColor, null);
expect(bannerTheme.shadowColor, null);
expect(bannerTheme.dividerColor, null);
expect(bannerTheme.contentTextStyle, null); expect(bannerTheme.contentTextStyle, null);
expect(bannerTheme.elevation, null);
expect(bannerTheme.padding, null);
expect(bannerTheme.leadingPadding, null);
}); });
testWidgets('Default MaterialBannerThemeData debugFillProperties', (WidgetTester tester) async { testWidgets('Default MaterialBannerThemeData debugFillProperties', (WidgetTester tester) async {
...@@ -29,9 +23,9 @@ void main() { ...@@ -29,9 +23,9 @@ void main() {
const MaterialBannerThemeData().debugFillProperties(builder); const MaterialBannerThemeData().debugFillProperties(builder);
final List<String> description = builder.properties final List<String> description = builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
.map((DiagnosticsNode node) => node.toString()) .map((DiagnosticsNode node) => node.toString())
.toList(); .toList();
expect(description, <String>[]); expect(description, <String>[]);
}); });
...@@ -39,43 +33,27 @@ void main() { ...@@ -39,43 +33,27 @@ void main() {
testWidgets('MaterialBannerThemeData implements debugFillProperties', (WidgetTester tester) async { testWidgets('MaterialBannerThemeData implements debugFillProperties', (WidgetTester tester) async {
final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder(); final DiagnosticPropertiesBuilder builder = DiagnosticPropertiesBuilder();
const MaterialBannerThemeData( const MaterialBannerThemeData(
backgroundColor: Color(0xfffffff0), backgroundColor: Color(0xFFFFFFFF),
surfaceTintColor: Color(0xfffffff1), contentTextStyle: TextStyle(color: Color(0xFFFFFFFF)),
shadowColor: Color(0xfffffff2),
dividerColor: Color(0xfffffff3),
contentTextStyle: TextStyle(color: Color(0xfffffff4)),
elevation: 4.0,
padding: EdgeInsets.all(20.0),
leadingPadding: EdgeInsets.only(left: 8.0),
).debugFillProperties(builder); ).debugFillProperties(builder);
final List<String> description = builder.properties final List<String> description = builder.properties
.where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info)) .where((DiagnosticsNode node) => !node.isFiltered(DiagnosticLevel.info))
.map((DiagnosticsNode node) => node.toString()) .map((DiagnosticsNode node) => node.toString())
.toList(); .toList();
expect(description, <String>[ expect(description, <String>[
'backgroundColor: Color(0xfffffff0)', 'backgroundColor: Color(0xffffffff)',
'surfaceTintColor: Color(0xfffffff1)', 'contentTextStyle: TextStyle(inherit: true, color: Color(0xffffffff))',
'shadowColor: Color(0xfffffff2)',
'dividerColor: Color(0xfffffff3)',
'contentTextStyle: TextStyle(inherit: true, color: Color(0xfffffff4))',
'elevation: 4.0',
'padding: EdgeInsets.all(20.0)',
'leadingPadding: EdgeInsets(8.0, 0.0, 0.0, 0.0)',
]); ]);
}); });
testWidgets('Passing no MaterialBannerThemeData returns defaults', (WidgetTester tester) async { testWidgets('Passing no MaterialBannerThemeData returns defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData();
const String contentText = 'Content'; const String contentText = 'Content';
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
theme: ThemeData(useMaterial3: true),
home: Scaffold( home: Scaffold(
body: MaterialBanner( body: MaterialBanner(
content: const Text(contentText), content: const Text(contentText),
leading: const Icon(Icons.umbrella),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: const Text('Action'), child: const Text('Action'),
...@@ -87,39 +65,16 @@ void main() { ...@@ -87,39 +65,16 @@ void main() {
)); ));
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, const Color(0xffffffff));
expect(material.surfaceTintColor, theme.colorScheme.surfaceTint);
expect(material.shadowColor, null);
expect(material.elevation, 0.0);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
// Default value for ThemeData.typography is Typography.material2021() expect(material.color, const Color(0xffffffff));
expect( // Default value for ThemeData.typography is Typography.material2014()
content.text.style, expect(content.text.style, Typography.material2014().englishLike.bodyMedium!.merge(Typography.material2014().black.bodyMedium));
Typography.material2021().englishLike.bodyMedium!.merge(
Typography.material2021().black.bodyMedium,
),
);
final Offset rowTopLeft = tester.getTopLeft(find.byType(Row));
final Offset materialTopLeft = tester.getTopLeft(_materialFinder());
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.umbrella));
expect(rowTopLeft.dy - materialTopLeft.dy, 2.0); // Default single line top padding.
expect(rowTopLeft.dx - materialTopLeft.dx, 16.0); // Default single line start padding.
expect(leadingTopLeft.dy - materialTopLeft.dy, 16); // Default leading padding.
expect(leadingTopLeft.dx - materialTopLeft.dx, 16); // Default leading padding.
final Divider divider = tester.widget<Divider>(find.byType(Divider));
expect(divider.color, theme.colorScheme.surfaceVariant);
}); });
testWidgets('Passing no MaterialBannerThemeData returns defaults when presented by ScaffoldMessenger', (WidgetTester tester) async { testWidgets('Passing no MaterialBannerThemeData returns defaults when presented by ScaffoldMessenger', (WidgetTester tester) async {
final ThemeData theme = ThemeData();
const String contentText = 'Content'; const String contentText = 'Content';
const Key tapTarget = Key('tap-target'); const Key tapTarget = Key('tap-target');
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
theme: ThemeData(useMaterial3: true),
home: Scaffold( home: Scaffold(
body: Builder( body: Builder(
builder: (BuildContext context) { builder: (BuildContext context) {
...@@ -128,7 +83,6 @@ void main() { ...@@ -128,7 +83,6 @@ void main() {
onTap: () { onTap: () {
ScaffoldMessenger.of(context).showMaterialBanner(MaterialBanner( ScaffoldMessenger.of(context).showMaterialBanner(MaterialBanner(
content: const Text(contentText), content: const Text(contentText),
leading: const Icon(Icons.umbrella),
actions: <Widget>[ actions: <Widget>[
TextButton( TextButton(
child: const Text('Action'), child: const Text('Action'),
...@@ -151,30 +105,10 @@ void main() { ...@@ -151,30 +105,10 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, const Color(0xffffffff));
expect(material.surfaceTintColor, theme.colorScheme.surfaceTint);
expect(material.shadowColor, null);
expect(material.elevation, 0.0);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
// Default value for ThemeData.typography is Typography.material2021() expect(material.color, const Color(0xffffffff));
expect( // Default value for ThemeData.typography is Typography.material2014()
content.text.style, expect(content.text.style, Typography.material2014().englishLike.bodyMedium!.merge(Typography.material2014().black.bodyMedium));
Typography.material2021().englishLike.bodyMedium!.merge(
Typography.material2021().black.bodyMedium,
),
);
final Offset rowTopLeft = tester.getTopLeft(find.byType(Row));
final Offset materialTopLeft = tester.getTopLeft(_materialFinder());
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.umbrella));
expect(rowTopLeft.dy - materialTopLeft.dy, 2.0); // Default single line top padding.
expect(rowTopLeft.dx - materialTopLeft.dx, 16.0); // Default single line start padding.
expect(leadingTopLeft.dy - materialTopLeft.dy, 16); // Default leading padding.
expect(leadingTopLeft.dx - materialTopLeft.dx, 16); // Default leading padding.
final Divider divider = tester.widget<Divider>(find.byType(Divider));
expect(divider.color, theme.colorScheme.surfaceVariant);
}); });
testWidgets('MaterialBanner uses values from MaterialBannerThemeData', (WidgetTester tester) async { testWidgets('MaterialBanner uses values from MaterialBannerThemeData', (WidgetTester tester) async {
...@@ -197,12 +131,8 @@ void main() { ...@@ -197,12 +131,8 @@ void main() {
)); ));
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, bannerTheme.backgroundColor);
expect(material.surfaceTintColor, bannerTheme.surfaceTintColor);
expect(material.shadowColor, bannerTheme.shadowColor);
expect(material.elevation, bannerTheme.elevation);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
expect(material.color, bannerTheme.backgroundColor);
expect(content.text.style, bannerTheme.contentTextStyle); expect(content.text.style, bannerTheme.contentTextStyle);
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText)); final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
...@@ -212,8 +142,6 @@ void main() { ...@@ -212,8 +142,6 @@ void main() {
expect(contentTopLeft.dx - materialTopLeft.dx, 41); expect(contentTopLeft.dx - materialTopLeft.dx, 41);
expect(leadingTopLeft.dy - materialTopLeft.dy, 19); expect(leadingTopLeft.dy - materialTopLeft.dy, 19);
expect(leadingTopLeft.dx - materialTopLeft.dx, 11); expect(leadingTopLeft.dx - materialTopLeft.dx, 11);
expect(find.byType(Divider), findsNothing);
}); });
testWidgets('MaterialBanner uses values from MaterialBannerThemeData when presented by ScaffoldMessenger', (WidgetTester tester) async { testWidgets('MaterialBanner uses values from MaterialBannerThemeData when presented by ScaffoldMessenger', (WidgetTester tester) async {
...@@ -253,12 +181,8 @@ void main() { ...@@ -253,12 +181,8 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, bannerTheme.backgroundColor);
expect(material.surfaceTintColor, bannerTheme.surfaceTintColor);
expect(material.shadowColor, bannerTheme.shadowColor);
expect(material.elevation, bannerTheme.elevation);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
expect(material.color, bannerTheme.backgroundColor);
expect(content.text.style, bannerTheme.contentTextStyle); expect(content.text.style, bannerTheme.contentTextStyle);
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText)); final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
...@@ -268,26 +192,18 @@ void main() { ...@@ -268,26 +192,18 @@ void main() {
expect(contentTopLeft.dx - materialTopLeft.dx, 41); expect(contentTopLeft.dx - materialTopLeft.dx, 41);
expect(leadingTopLeft.dy - materialTopLeft.dy, 19); expect(leadingTopLeft.dy - materialTopLeft.dy, 19);
expect(leadingTopLeft.dx - materialTopLeft.dx, 11); expect(leadingTopLeft.dx - materialTopLeft.dx, 11);
expect(find.byType(Divider), findsNothing);
}); });
testWidgets('MaterialBanner widget properties take priority over theme', (WidgetTester tester) async { testWidgets('MaterialBanner widget properties take priority over theme', (WidgetTester tester) async {
const Color backgroundColor = Colors.purple; const Color backgroundColor = Colors.purple;
const Color surfaceTintColor = Colors.red;
const Color shadowColor = Colors.orange;
const TextStyle textStyle = TextStyle(color: Colors.green); const TextStyle textStyle = TextStyle(color: Colors.green);
final MaterialBannerThemeData bannerTheme = _bannerTheme(); final MaterialBannerThemeData bannerTheme = _bannerTheme();
const String contentText = 'Content'; const String contentText = 'Content';
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
theme: ThemeData(bannerTheme: bannerTheme), theme: ThemeData(bannerTheme: bannerTheme),
home: Scaffold( home: Scaffold(
body: MaterialBanner( body: MaterialBanner(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
surfaceTintColor: surfaceTintColor,
shadowColor: shadowColor,
elevation: 6.0,
leading: const Icon(Icons.ac_unit), leading: const Icon(Icons.ac_unit),
contentTextStyle: textStyle, contentTextStyle: textStyle,
content: const Text(contentText), content: const Text(contentText),
...@@ -304,12 +220,8 @@ void main() { ...@@ -304,12 +220,8 @@ void main() {
)); ));
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, backgroundColor);
expect(material.surfaceTintColor, surfaceTintColor);
expect(material.shadowColor, shadowColor);
expect(material.elevation, 6.0);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
expect(material.color, backgroundColor);
expect(content.text.style, textStyle); expect(content.text.style, textStyle);
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText)); final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
...@@ -319,18 +231,14 @@ void main() { ...@@ -319,18 +231,14 @@ void main() {
expect(contentTopLeft.dx - materialTopLeft.dx, 58); expect(contentTopLeft.dx - materialTopLeft.dx, 58);
expect(leadingTopLeft.dy - materialTopLeft.dy, 24); expect(leadingTopLeft.dy - materialTopLeft.dy, 24);
expect(leadingTopLeft.dx - materialTopLeft.dx, 22); expect(leadingTopLeft.dx - materialTopLeft.dx, 22);
expect(find.byType(Divider), findsNothing);
}); });
testWidgets('MaterialBanner widget properties take priority over theme when presented by ScaffoldMessenger', (WidgetTester tester) async { testWidgets('MaterialBanner widget properties take priority over theme when presented by ScaffoldMessenger', (WidgetTester tester) async {
const Color backgroundColor = Colors.purple; const Color backgroundColor = Colors.purple;
const double elevation = 6.0;
const TextStyle textStyle = TextStyle(color: Colors.green); const TextStyle textStyle = TextStyle(color: Colors.green);
final MaterialBannerThemeData bannerTheme = _bannerTheme(); final MaterialBannerThemeData bannerTheme = _bannerTheme();
const String contentText = 'Content'; const String contentText = 'Content';
const Key tapTarget = Key('tap-target'); const Key tapTarget = Key('tap-target');
await tester.pumpWidget(MaterialApp( await tester.pumpWidget(MaterialApp(
theme: ThemeData(bannerTheme: bannerTheme), theme: ThemeData(bannerTheme: bannerTheme),
home: Scaffold( home: Scaffold(
...@@ -341,7 +249,6 @@ void main() { ...@@ -341,7 +249,6 @@ void main() {
onTap: () { onTap: () {
ScaffoldMessenger.of(context).showMaterialBanner(MaterialBanner( ScaffoldMessenger.of(context).showMaterialBanner(MaterialBanner(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
elevation: elevation,
leading: const Icon(Icons.ac_unit), leading: const Icon(Icons.ac_unit),
contentTextStyle: textStyle, contentTextStyle: textStyle,
content: const Text(contentText), content: const Text(contentText),
...@@ -369,10 +276,8 @@ void main() { ...@@ -369,10 +276,8 @@ void main() {
await tester.pumpAndSettle(); await tester.pumpAndSettle();
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, backgroundColor);
expect(material.elevation, elevation);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText); final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
expect(material.color, backgroundColor);
expect(content.text.style, textStyle); expect(content.text.style, textStyle);
final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText)); final Offset contentTopLeft = tester.getTopLeft(_textFinder(contentText));
...@@ -382,8 +287,6 @@ void main() { ...@@ -382,8 +287,6 @@ void main() {
expect(contentTopLeft.dx - materialTopLeft.dx, 58); expect(contentTopLeft.dx - materialTopLeft.dx, 58);
expect(leadingTopLeft.dy - materialTopLeft.dy, 24); expect(leadingTopLeft.dy - materialTopLeft.dy, 24);
expect(leadingTopLeft.dx - materialTopLeft.dx, 22); expect(leadingTopLeft.dx - materialTopLeft.dx, 22);
expect(find.byType(Divider), findsNothing);
}); });
testWidgets('MaterialBanner uses color scheme when necessary', (WidgetTester tester) async { testWidgets('MaterialBanner uses color scheme when necessary', (WidgetTester tester) async {
...@@ -446,130 +349,12 @@ void main() { ...@@ -446,130 +349,12 @@ void main() {
final Material material = _getMaterialFromText(tester, contentText); final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, colorScheme.surface); expect(material.color, colorScheme.surface);
}); });
group('Material 2', () {
// Tests that are only relevant for Material 2. Once ThemeData.useMaterial3
// is turned on by default, these tests can be removed.
testWidgets('Passing no MaterialBannerThemeData returns defaults', (WidgetTester tester) async {
final ThemeData theme = ThemeData();
const String contentText = 'Content';
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: MaterialBanner(
content: const Text(contentText),
leading: const Icon(Icons.umbrella),
actions: <Widget>[
TextButton(
child: const Text('Action'),
onPressed: () { },
),
],
),
),
));
final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, const Color(0xffffffff));
expect(material.surfaceTintColor, null);
expect(material.shadowColor, null);
expect(material.elevation, 0.0);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
// Default value for ThemeData.typography is Typography.material2014()
expect(
content.text.style,
Typography.material2014().englishLike.bodyText2!.merge(
Typography.material2014().black.bodyText2,
),
);
final Offset rowTopLeft = tester.getTopLeft(find.byType(Row));
final Offset materialTopLeft = tester.getTopLeft(_materialFinder());
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.umbrella));
expect(rowTopLeft.dy - materialTopLeft.dy, 2.0); // Default single line top padding.
expect(rowTopLeft.dx - materialTopLeft.dx, 16.0); // Default single line start padding.
expect(leadingTopLeft.dy - materialTopLeft.dy, 16); // Default leading padding.
expect(leadingTopLeft.dx - materialTopLeft.dx, 16); // Default leading padding.
final Divider divider = tester.widget<Divider>(find.byType(Divider));
expect(divider.color, theme.colorScheme.surfaceVariant);
});
testWidgets('Passing no MaterialBannerThemeData returns defaults when presented by ScaffoldMessenger', (WidgetTester tester) async {
final ThemeData theme = ThemeData();
const String contentText = 'Content';
const Key tapTarget = Key('tap-target');
await tester.pumpWidget(MaterialApp(
home: Scaffold(
body: Builder(
builder: (BuildContext context) {
return GestureDetector(
key: tapTarget,
onTap: () {
ScaffoldMessenger.of(context).showMaterialBanner(MaterialBanner(
content: const Text(contentText),
leading: const Icon(Icons.umbrella),
actions: <Widget>[
TextButton(
child: const Text('Action'),
onPressed: () { },
),
],
));
},
behavior: HitTestBehavior.opaque,
child: const SizedBox(
height: 100.0,
width: 100.0,
),
);
},
),
),
));
await tester.tap(find.byKey(tapTarget));
await tester.pumpAndSettle();
final Material material = _getMaterialFromText(tester, contentText);
expect(material.color, const Color(0xffffffff));
expect(material.surfaceTintColor, null);
expect(material.shadowColor, null);
expect(material.elevation, 0.0);
final RenderParagraph content = _getTextRenderObjectFromDialog(tester, contentText);
// Default value for ThemeData.typography is Typography.material2014()
expect(
content.text.style,
Typography.material2014().englishLike.bodyText2!.merge(
Typography.material2014().black.bodyText2,
),
);
final Offset rowTopLeft = tester.getTopLeft(find.byType(Row));
final Offset materialTopLeft = tester.getTopLeft(_materialFinder());
final Offset leadingTopLeft = tester.getTopLeft(find.byIcon(Icons.umbrella));
expect(rowTopLeft.dy - materialTopLeft.dy, 2.0); // Default single line top padding.
expect(rowTopLeft.dx - materialTopLeft.dx, 16.0); // Default single line start padding.
expect(leadingTopLeft.dy - materialTopLeft.dy, 16); // Default leading padding.
expect(leadingTopLeft.dx - materialTopLeft.dx, 16); // Default leading padding.
final Divider divider = tester.widget<Divider>(find.byType(Divider));
expect(divider.color, theme.colorScheme.surfaceVariant);
});
});
} }
MaterialBannerThemeData _bannerTheme() { MaterialBannerThemeData _bannerTheme() {
return const MaterialBannerThemeData( return const MaterialBannerThemeData(
backgroundColor: Colors.orange, backgroundColor: Colors.orange,
surfaceTintColor: Colors.yellow,
shadowColor: Colors.red,
dividerColor: Colors.green,
contentTextStyle: TextStyle(color: Colors.pink), contentTextStyle: TextStyle(color: Colors.pink),
elevation: 4.0,
padding: EdgeInsets.all(5), padding: EdgeInsets.all(5),
leadingPadding: EdgeInsets.all(6), leadingPadding: EdgeInsets.all(6),
); );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment