Unverified Commit 212bac80 authored by Hans Muller's avatar Hans Muller Committed by GitHub

Revert "Update `ExpansionTile` to support Material 3 & add an example (#119712)" (#120300)

This reverts commit e8eac0d0.
parent 51227a9a
...@@ -31,7 +31,6 @@ import 'package:gen_defaults/date_picker_template.dart'; ...@@ -31,7 +31,6 @@ import 'package:gen_defaults/date_picker_template.dart';
import 'package:gen_defaults/dialog_template.dart'; import 'package:gen_defaults/dialog_template.dart';
import 'package:gen_defaults/divider_template.dart'; import 'package:gen_defaults/divider_template.dart';
import 'package:gen_defaults/drawer_template.dart'; import 'package:gen_defaults/drawer_template.dart';
import 'package:gen_defaults/expansion_tile_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/filter_chip_template.dart';
import 'package:gen_defaults/icon_button_template.dart'; import 'package:gen_defaults/icon_button_template.dart';
...@@ -154,7 +153,6 @@ Future<void> main(List<String> args) async { ...@@ -154,7 +153,6 @@ Future<void> main(List<String> args) async {
DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile(); DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile();
DividerTemplate('Divider', '$materialLib/divider.dart', tokens).updateFile(); DividerTemplate('Divider', '$materialLib/divider.dart', tokens).updateFile();
DrawerTemplate('Drawer', '$materialLib/drawer.dart', tokens).updateFile(); DrawerTemplate('Drawer', '$materialLib/drawer.dart', tokens).updateFile();
ExpansionTileTemplate('ExpansionTile', '$materialLib/expansion_tile.dart', tokens).updateFile();
FABTemplate('FAB', '$materialLib/floating_action_button.dart', tokens).updateFile(); FABTemplate('FAB', '$materialLib/floating_action_button.dart', tokens).updateFile();
FilterChipTemplate('ChoiceChip', '$materialLib/choice_chip.dart', tokens).updateFile(); FilterChipTemplate('ChoiceChip', '$materialLib/choice_chip.dart', tokens).updateFile();
FilterChipTemplate('FilterChip', '$materialLib/filter_chip.dart', tokens).updateFile(); FilterChipTemplate('FilterChip', '$materialLib/filter_chip.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 ExpansionTileTemplate extends TokenTemplate {
const ExpansionTileTemplate(super.blockName, super.fileName, super.tokens, {
super.colorSchemePrefix = '_colors.',
});
@override
String generate() => '''
class _${blockName}DefaultsM3 extends ExpansionTileThemeData {
_${blockName}DefaultsM3(this.context);
final BuildContext context;
late final ThemeData _theme = Theme.of(context);
late final ColorScheme _colors = _theme.colorScheme;
@override
Color? get textColor => ${textStyle("md.comp.list.list-item.label-text")}!.color;
@override
Color? get iconColor => ${componentColor('md.comp.list.list-item.selected.trailing-icon')};
@override
Color? get collapsedTextColor => ${textStyle("md.comp.list.list-item.label-text")}!.color;
@override
Color? get collapsedIconColor => ${componentColor('md.comp.list.list-item.unselected.trailing-icon')};
}
''';
}
...@@ -6,31 +6,33 @@ ...@@ -6,31 +6,33 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
void main() => runApp(const ExpansionTileApp()); void main() => runApp(const MyApp());
class ExpansionTileApp extends StatelessWidget { class MyApp extends StatelessWidget {
const ExpansionTileApp({super.key}); const MyApp({super.key});
static const String _title = 'Flutter Code Sample';
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
theme: ThemeData(useMaterial3: true), title: _title,
home: Scaffold( home: Scaffold(
appBar: AppBar(title: const Text('ExpansionTile Sample')), appBar: AppBar(title: const Text(_title)),
body: const ExpansionTileExample(), body: const MyStatefulWidget(),
), ),
); );
} }
} }
class ExpansionTileExample extends StatefulWidget { class MyStatefulWidget extends StatefulWidget {
const ExpansionTileExample({super.key}); const MyStatefulWidget({super.key});
@override @override
State<ExpansionTileExample> createState() => _ExpansionTileExampleState(); State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
} }
class _ExpansionTileExampleState extends State<ExpansionTileExample> { class _MyStatefulWidgetState extends State<MyStatefulWidget> {
bool _customTileExpanded = false; bool _customTileExpanded = false;
@override @override
...@@ -56,9 +58,7 @@ class _ExpansionTileExampleState extends State<ExpansionTileExample> { ...@@ -56,9 +58,7 @@ class _ExpansionTileExampleState extends State<ExpansionTileExample> {
ListTile(title: Text('This is tile number 2')), ListTile(title: Text('This is tile number 2')),
], ],
onExpansionChanged: (bool expanded) { onExpansionChanged: (bool expanded) {
setState(() { setState(() => _customTileExpanded = expanded);
_customTileExpanded = expanded;
});
}, },
), ),
const ExpansionTile( const ExpansionTile(
......
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/material/expansion_tile/expansion_tile.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('When expansion tiles are expanded tile numbers are revealed', (WidgetTester tester) async {
const int totalTiles = 3;
await tester.pumpWidget(
const example.ExpansionTileApp(),
);
expect(find.byType(ExpansionTile), findsNWidgets(totalTiles));
const String tileOne = 'This is tile number 1';
expect(find.text(tileOne), findsNothing);
await tester.tap(find.text('ExpansionTile 1'));
await tester.pumpAndSettle();
expect(find.text(tileOne), findsOneWidget);
const String tileTwo = 'This is tile number 2';
expect(find.text(tileTwo), findsNothing);
await tester.tap(find.text('ExpansionTile 2'));
await tester.pumpAndSettle();
expect(find.text(tileTwo), findsOneWidget);
const String tileThree = 'This is tile number 3';
expect(find.text(tileThree), findsNothing);
await tester.tap(find.text('ExpansionTile 3'));
await tester.pumpAndSettle();
expect(find.text(tileThree), findsOneWidget);
});
}
...@@ -34,8 +34,7 @@ const Duration _kExpand = Duration(milliseconds: 200); ...@@ -34,8 +34,7 @@ const Duration _kExpand = Duration(milliseconds: 200);
/// to the [leading] and [trailing] properties of [ExpansionTile]. /// to the [leading] and [trailing] properties of [ExpansionTile].
/// ///
/// {@tool dartpad} /// {@tool dartpad}
/// This example demonstrates how the [ExpansionTile] icon's location and appearance /// This example demonstrates different configurations of ExpansionTile.
/// can be customized.
/// ///
/// ** See code in examples/api/lib/material/expansion_tile/expansion_tile.0.dart ** /// ** See code in examples/api/lib/material/expansion_tile/expansion_tile.0.dart **
/// {@end-tool} /// {@end-tool}
...@@ -217,7 +216,7 @@ class ExpansionTile extends StatefulWidget { ...@@ -217,7 +216,7 @@ class ExpansionTile extends StatefulWidget {
/// Used to override to the [ListTileThemeData.iconColor]. /// Used to override to the [ListTileThemeData.iconColor].
/// ///
/// If this property is null then [ExpansionTileThemeData.iconColor] is used. If that /// If this property is null then [ExpansionTileThemeData.iconColor] is used. If that
/// is also null then the value of [ColorScheme.primary] is used. /// is also null then the value of [ListTileThemeData.iconColor] is used.
/// ///
/// See also: /// See also:
/// ///
...@@ -228,15 +227,6 @@ class ExpansionTile extends StatefulWidget { ...@@ -228,15 +227,6 @@ class ExpansionTile extends StatefulWidget {
/// The icon color of tile's expansion arrow icon when the sublist is collapsed. /// The icon color of tile's expansion arrow icon when the sublist is collapsed.
/// ///
/// Used to override to the [ListTileThemeData.iconColor]. /// Used to override to the [ListTileThemeData.iconColor].
///
/// If this property is null then [ExpansionTileThemeData.collapsedIconColor] is used. If that
/// is also null and [ThemeData.useMaterial3] is true, [ColorScheme.onSurface] is used. Otherwise,
/// defaults to [ThemeData.unselectedWidgetColor] color.
///
/// See also:
///
/// * [ExpansionTileTheme.of], which returns the nearest [ExpansionTileTheme]'s
/// [ExpansionTileThemeData].
final Color? collapsedIconColor; final Color? collapsedIconColor;
...@@ -245,8 +235,7 @@ class ExpansionTile extends StatefulWidget { ...@@ -245,8 +235,7 @@ class ExpansionTile extends StatefulWidget {
/// Used to override to the [ListTileThemeData.textColor]. /// Used to override to the [ListTileThemeData.textColor].
/// ///
/// If this property is null then [ExpansionTileThemeData.textColor] is used. If that /// If this property is null then [ExpansionTileThemeData.textColor] is used. If that
/// is also null then and [ThemeData.useMaterial3] is true, color of the [TextTheme.bodyLarge] /// is also null then the value of [ListTileThemeData.textColor] is used.
/// will be used for the [title] and [subtitle]. Otherwise, defaults to [ColorScheme.primary] color.
/// ///
/// See also: /// See also:
/// ///
...@@ -258,10 +247,8 @@ class ExpansionTile extends StatefulWidget { ...@@ -258,10 +247,8 @@ class ExpansionTile extends StatefulWidget {
/// ///
/// Used to override to the [ListTileThemeData.textColor]. /// Used to override to the [ListTileThemeData.textColor].
/// ///
/// If this property is null then [ExpansionTileThemeData.collapsedTextColor] is used. /// If this property is null then [ExpansionTileThemeData.collapsedTextColor] is used. If that
/// If that is also null and [ThemeData.useMaterial3] is true, color of the /// is also null then the value of [ListTileThemeData.textColor] is used.
/// [TextTheme.bodyLarge] will be used for the [title] and [subtitle]. Otherwise,
/// defaults to color of the [TextTheme.titleMedium].
/// ///
/// See also: /// See also:
/// ///
...@@ -454,9 +441,7 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider ...@@ -454,9 +441,7 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider
void didChangeDependencies() { void didChangeDependencies() {
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(context); final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(context);
final ExpansionTileThemeData defaults = theme.useMaterial3 final ColorScheme colorScheme = theme.colorScheme;
? _ExpansionTileDefaultsM3(context)
: _ExpansionTileDefaultsM2(context);
_borderTween _borderTween
..begin = widget.collapsedShape ..begin = widget.collapsedShape
?? expansionTileTheme.collapsedShape ?? expansionTileTheme.collapsedShape
...@@ -473,13 +458,13 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider ...@@ -473,13 +458,13 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider
_headerColorTween _headerColorTween
..begin = widget.collapsedTextColor ..begin = widget.collapsedTextColor
?? expansionTileTheme.collapsedTextColor ?? expansionTileTheme.collapsedTextColor
?? defaults.collapsedTextColor ?? theme.textTheme.titleMedium!.color
..end = widget.textColor ?? expansionTileTheme.textColor ?? defaults.textColor; ..end = widget.textColor ?? expansionTileTheme.textColor ?? colorScheme.primary;
_iconColorTween _iconColorTween
..begin = widget.collapsedIconColor ..begin = widget.collapsedIconColor
?? expansionTileTheme.collapsedIconColor ?? expansionTileTheme.collapsedIconColor
?? defaults.collapsedIconColor ?? theme.unselectedWidgetColor
..end = widget.iconColor ?? expansionTileTheme.iconColor ?? defaults.iconColor; ..end = widget.iconColor ?? expansionTileTheme.iconColor ?? colorScheme.primary;
_backgroundColorTween _backgroundColorTween
..begin = widget.collapsedBackgroundColor ?? expansionTileTheme.collapsedBackgroundColor ..begin = widget.collapsedBackgroundColor ?? expansionTileTheme.collapsedBackgroundColor
..end = widget.backgroundColor ?? expansionTileTheme.backgroundColor; ..end = widget.backgroundColor ?? expansionTileTheme.backgroundColor;
...@@ -513,54 +498,3 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider ...@@ -513,54 +498,3 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider
); );
} }
} }
class _ExpansionTileDefaultsM2 extends ExpansionTileThemeData {
_ExpansionTileDefaultsM2(this.context);
final BuildContext context;
late final ThemeData _theme = Theme.of(context);
late final ColorScheme _colorScheme = _theme.colorScheme;
@override
Color? get textColor => _colorScheme.primary;
@override
Color? get iconColor => _colorScheme.primary;
@override
Color? get collapsedTextColor => _theme.textTheme.titleMedium!.color;
@override
Color? get collapsedIconColor => _theme.unselectedWidgetColor;
}
// BEGIN GENERATED TOKEN PROPERTIES - ExpansionTile
// 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_152
class _ExpansionTileDefaultsM3 extends ExpansionTileThemeData {
_ExpansionTileDefaultsM3(this.context);
final BuildContext context;
late final ThemeData _theme = Theme.of(context);
late final ColorScheme _colors = _theme.colorScheme;
@override
Color? get textColor => Theme.of(context).textTheme.bodyLarge!.color;
@override
Color? get iconColor => _colors.primary;
@override
Color? get collapsedTextColor => Theme.of(context).textTheme.bodyLarge!.color;
@override
Color? get collapsedIconColor => _colors.onSurface;
}
// END GENERATED TOKEN PROPERTIES - ExpansionTile
...@@ -522,35 +522,6 @@ void main() { ...@@ -522,35 +522,6 @@ void main() {
expect(shapeDecoration.color, backgroundColor); expect(shapeDecoration.color, backgroundColor);
}); });
testWidgets('ExpansionTile default iconColor, textColor', (WidgetTester tester) async {
final ThemeData theme = ThemeData(useMaterial3: true);
await tester.pumpWidget(MaterialApp(
theme: theme,
home: const Material(
child: ExpansionTile(
title: TestText('title'),
trailing: TestIcon(),
children: <Widget>[
SizedBox(height: 100, width: 100),
],
),
),
));
Color getIconColor() => tester.state<TestIconState>(find.byType(TestIcon)).iconTheme.color!;
Color getTextColor() => tester.state<TestTextState>(find.byType(TestText)).textStyle.color!;
expect(getIconColor(), theme.colorScheme.onSurface);
expect(getTextColor(), theme.textTheme.bodyLarge!.color);
await tester.tap(find.text('title'));
await tester.pumpAndSettle();
expect(getIconColor(), theme.colorScheme.primary);
expect(getTextColor(), theme.textTheme.bodyLarge!.color);
});
testWidgets('ExpansionTile iconColor, textColor', (WidgetTester tester) async { testWidgets('ExpansionTile iconColor, textColor', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/pull/78281 // Regression test for https://github.com/flutter/flutter/pull/78281
...@@ -695,38 +666,4 @@ void main() { ...@@ -695,38 +666,4 @@ void main() {
expect(listTile.leading.runtimeType, Icon); expect(listTile.leading.runtimeType, Icon);
expect(listTile.trailing, isNull); expect(listTile.trailing, isNull);
}); });
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('ExpansionTile default iconColor, textColor', (WidgetTester tester) async {
final ThemeData theme = ThemeData(useMaterial3: false);
await tester.pumpWidget(MaterialApp(
theme: theme,
home: const Material(
child: ExpansionTile(
title: TestText('title'),
trailing: TestIcon(),
children: <Widget>[
SizedBox(height: 100, width: 100),
],
),
),
));
Color getIconColor() => tester.state<TestIconState>(find.byType(TestIcon)).iconTheme.color!;
Color getTextColor() => tester.state<TestTextState>(find.byType(TestText)).textStyle.color!;
expect(getIconColor(), theme.unselectedWidgetColor);
expect(getTextColor(), theme.textTheme.titleMedium!.color);
await tester.tap(find.text('title'));
await tester.pumpAndSettle();
expect(getIconColor(), theme.colorScheme.primary);
expect(getTextColor(), theme.colorScheme.primary);
});
});
} }
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