mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
This reverts commit e8eac0d047
.
This commit is contained in:
parent
51227a9a50
commit
212bac80d1
@ -31,7 +31,6 @@ import 'package:gen_defaults/date_picker_template.dart';
|
||||
import 'package:gen_defaults/dialog_template.dart';
|
||||
import 'package:gen_defaults/divider_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/filter_chip_template.dart';
|
||||
import 'package:gen_defaults/icon_button_template.dart';
|
||||
@ -154,7 +153,6 @@ Future<void> main(List<String> args) async {
|
||||
DialogTemplate('Dialog', '$materialLib/dialog.dart', tokens).updateFile();
|
||||
DividerTemplate('Divider', '$materialLib/divider.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();
|
||||
FilterChipTemplate('ChoiceChip', '$materialLib/choice_chip.dart', tokens).updateFile();
|
||||
FilterChipTemplate('FilterChip', '$materialLib/filter_chip.dart', tokens).updateFile();
|
||||
|
@ -1,34 +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.
|
||||
|
||||
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 @@
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
void main() => runApp(const ExpansionTileApp());
|
||||
void main() => runApp(const MyApp());
|
||||
|
||||
class ExpansionTileApp extends StatelessWidget {
|
||||
const ExpansionTileApp({super.key});
|
||||
class MyApp extends StatelessWidget {
|
||||
const MyApp({super.key});
|
||||
|
||||
static const String _title = 'Flutter Code Sample';
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
theme: ThemeData(useMaterial3: true),
|
||||
title: _title,
|
||||
home: Scaffold(
|
||||
appBar: AppBar(title: const Text('ExpansionTile Sample')),
|
||||
body: const ExpansionTileExample(),
|
||||
appBar: AppBar(title: const Text(_title)),
|
||||
body: const MyStatefulWidget(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ExpansionTileExample extends StatefulWidget {
|
||||
const ExpansionTileExample({super.key});
|
||||
class MyStatefulWidget extends StatefulWidget {
|
||||
const MyStatefulWidget({super.key});
|
||||
|
||||
@override
|
||||
State<ExpansionTileExample> createState() => _ExpansionTileExampleState();
|
||||
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
|
||||
}
|
||||
|
||||
class _ExpansionTileExampleState extends State<ExpansionTileExample> {
|
||||
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
|
||||
bool _customTileExpanded = false;
|
||||
|
||||
@override
|
||||
@ -56,9 +58,7 @@ class _ExpansionTileExampleState extends State<ExpansionTileExample> {
|
||||
ListTile(title: Text('This is tile number 2')),
|
||||
],
|
||||
onExpansionChanged: (bool expanded) {
|
||||
setState(() {
|
||||
_customTileExpanded = expanded;
|
||||
});
|
||||
setState(() => _customTileExpanded = expanded);
|
||||
},
|
||||
),
|
||||
const ExpansionTile(
|
||||
|
@ -1,40 +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.
|
||||
|
||||
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);
|
||||
/// to the [leading] and [trailing] properties of [ExpansionTile].
|
||||
///
|
||||
/// {@tool dartpad}
|
||||
/// This example demonstrates how the [ExpansionTile] icon's location and appearance
|
||||
/// can be customized.
|
||||
/// This example demonstrates different configurations of ExpansionTile.
|
||||
///
|
||||
/// ** See code in examples/api/lib/material/expansion_tile/expansion_tile.0.dart **
|
||||
/// {@end-tool}
|
||||
@ -217,7 +216,7 @@ class ExpansionTile extends StatefulWidget {
|
||||
/// Used to override to the [ListTileThemeData.iconColor].
|
||||
///
|
||||
/// 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:
|
||||
///
|
||||
@ -228,15 +227,6 @@ class ExpansionTile extends StatefulWidget {
|
||||
/// The icon color of tile's expansion arrow icon when the sublist is collapsed.
|
||||
///
|
||||
/// 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;
|
||||
|
||||
|
||||
@ -245,8 +235,7 @@ class ExpansionTile extends StatefulWidget {
|
||||
/// Used to override to the [ListTileThemeData.textColor].
|
||||
///
|
||||
/// 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]
|
||||
/// will be used for the [title] and [subtitle]. Otherwise, defaults to [ColorScheme.primary] color.
|
||||
/// is also null then the value of [ListTileThemeData.textColor] is used.
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
@ -258,10 +247,8 @@ class ExpansionTile extends StatefulWidget {
|
||||
///
|
||||
/// Used to override to the [ListTileThemeData.textColor].
|
||||
///
|
||||
/// If this property is null then [ExpansionTileThemeData.collapsedTextColor] is used.
|
||||
/// If that is also null and [ThemeData.useMaterial3] is true, color of the
|
||||
/// [TextTheme.bodyLarge] will be used for the [title] and [subtitle]. Otherwise,
|
||||
/// defaults to color of the [TextTheme.titleMedium].
|
||||
/// If this property is null then [ExpansionTileThemeData.collapsedTextColor] is used. If that
|
||||
/// is also null then the value of [ListTileThemeData.textColor] is used.
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
@ -454,9 +441,7 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider
|
||||
void didChangeDependencies() {
|
||||
final ThemeData theme = Theme.of(context);
|
||||
final ExpansionTileThemeData expansionTileTheme = ExpansionTileTheme.of(context);
|
||||
final ExpansionTileThemeData defaults = theme.useMaterial3
|
||||
? _ExpansionTileDefaultsM3(context)
|
||||
: _ExpansionTileDefaultsM2(context);
|
||||
final ColorScheme colorScheme = theme.colorScheme;
|
||||
_borderTween
|
||||
..begin = widget.collapsedShape
|
||||
?? expansionTileTheme.collapsedShape
|
||||
@ -473,13 +458,13 @@ class _ExpansionTileState extends State<ExpansionTile> with SingleTickerProvider
|
||||
_headerColorTween
|
||||
..begin = widget.collapsedTextColor
|
||||
?? expansionTileTheme.collapsedTextColor
|
||||
?? defaults.collapsedTextColor
|
||||
..end = widget.textColor ?? expansionTileTheme.textColor ?? defaults.textColor;
|
||||
?? theme.textTheme.titleMedium!.color
|
||||
..end = widget.textColor ?? expansionTileTheme.textColor ?? colorScheme.primary;
|
||||
_iconColorTween
|
||||
..begin = widget.collapsedIconColor
|
||||
?? expansionTileTheme.collapsedIconColor
|
||||
?? defaults.collapsedIconColor
|
||||
..end = widget.iconColor ?? expansionTileTheme.iconColor ?? defaults.iconColor;
|
||||
?? theme.unselectedWidgetColor
|
||||
..end = widget.iconColor ?? expansionTileTheme.iconColor ?? colorScheme.primary;
|
||||
_backgroundColorTween
|
||||
..begin = widget.collapsedBackgroundColor ?? expansionTileTheme.collapsedBackgroundColor
|
||||
..end = widget.backgroundColor ?? expansionTileTheme.backgroundColor;
|
||||
@ -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() {
|
||||
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 {
|
||||
// Regression test for https://github.com/flutter/flutter/pull/78281
|
||||
|
||||
@ -695,38 +666,4 @@ void main() {
|
||||
expect(listTile.leading.runtimeType, Icon);
|
||||
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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user