Added Features requested in #137530 (#137532)
This PR will add new parameters to `ExpansionTile` widget to manage `dense`, `visualDensity` and `enableFeedback` of the main ListTile.
Solves #137530
It is not a breaking change.
diff --git a/packages/flutter/lib/src/material/expansion_tile.dart b/packages/flutter/lib/src/material/expansion_tile.dart
index 6756931..cfd820f 100644
--- a/packages/flutter/lib/src/material/expansion_tile.dart
+++ b/packages/flutter/lib/src/material/expansion_tile.dart
@@ -14,6 +14,7 @@
import 'material.dart';
import 'material_localizations.dart';
import 'theme.dart';
+import 'theme_data.dart';
const Duration _kExpand = Duration(milliseconds: 200);
@@ -248,6 +249,9 @@
this.clipBehavior,
this.controlAffinity,
this.controller,
+ this.dense,
+ this.visualDensity,
+ this.enableFeedback = true,
}) : assert(
expandedCrossAxisAlignment != CrossAxisAlignment.baseline,
'CrossAxisAlignment.baseline is not supported since the expanded children '
@@ -491,6 +495,17 @@
/// than supplying a controller.
final ExpansionTileController? controller;
+ /// {@macro flutter.material.ListTile.dense}
+ final bool? dense;
+
+ /// Defines how compact the expansion tile's layout will be.
+ ///
+ /// {@macro flutter.material.themedata.visualDensity}
+ final VisualDensity? visualDensity;
+
+ /// {@macro flutter.material.ListTile.enableFeedback}
+ final bool? enableFeedback;
+
@override
State<ExpansionTile> createState() => _ExpansionTileState();
}
@@ -629,6 +644,7 @@
case TargetPlatform.windows:
break;
}
+
return Container(
clipBehavior: clipBehavior,
decoration: ShapeDecoration(
@@ -646,6 +662,9 @@
textColor: _headerColor.value,
child: ListTile(
onTap: _handleTap,
+ dense: widget.dense,
+ visualDensity: widget.visualDensity,
+ enableFeedback: widget.enableFeedback,
contentPadding: widget.tilePadding ?? expansionTileTheme.tilePadding,
leading: widget.leading ?? _buildLeadingIcon(context),
title: widget.title,
diff --git a/packages/flutter/lib/src/material/list_tile.dart b/packages/flutter/lib/src/material/list_tile.dart
index 7417872..98d1215 100644
--- a/packages/flutter/lib/src/material/list_tile.dart
+++ b/packages/flutter/lib/src/material/list_tile.dart
@@ -424,6 +424,7 @@
/// line limits using [Text.maxLines].
final bool isThreeLine;
+ /// {@template flutter.material.ListTile.dense}
/// Whether this list tile is part of a vertically dense list.
///
/// If this property is null then its value is based on [ListTileTheme.dense].
@@ -431,6 +432,7 @@
/// Dense list tiles default to a smaller height.
///
/// It is not recommended to set [dense] to true when [ThemeData.useMaterial3] is true.
+ /// {@endtemplate}
final bool? dense;
/// Defines how compact the list tile's layout will be.
diff --git a/packages/flutter/test/material/expansion_tile_test.dart b/packages/flutter/test/material/expansion_tile_test.dart
index 9900a11..79ba435 100644
--- a/packages/flutter/test/material/expansion_tile_test.dart
+++ b/packages/flutter/test/material/expansion_tile_test.dart
@@ -1198,4 +1198,38 @@
final ExpansionTileController? controller2 = ExpansionTileController.maybeOf(nonDescendantKey.currentContext!);
expect(controller2, isNull);
});
+
+ testWidgetsWithLeakTracking('Check if dense, enableFeedback, visualDensity parameter is working', (WidgetTester tester) async {
+ final GlobalKey titleKey = GlobalKey();
+ final GlobalKey nonDescendantKey = GlobalKey();
+
+ const bool dense = true;
+ const bool enableFeedback = false;
+ const VisualDensity visualDensity = VisualDensity.compact;
+
+ await tester.pumpWidget(MaterialApp(
+ home: Material(
+ child: Column(
+ children: <Widget>[
+ ExpansionTile(
+ dense: dense,
+ enableFeedback: enableFeedback,
+ visualDensity: visualDensity,
+ title: Text('Title', key: titleKey),
+ children: const <Widget>[
+ Text('Child 0'),
+ ],
+ ),
+ Text('Non descendant', key: nonDescendantKey),
+ ],
+ ),
+ ),
+ ));
+
+ final Finder tileFinder = find.byType(ListTile);
+ final ListTile tileWidget = tester.widget<ListTile>(tileFinder);
+ expect(tileWidget.dense, dense);
+ expect(tileWidget.enableFeedback, enableFeedback);
+ expect(tileWidget.visualDensity, visualDensity);
+ });
}