diff --git a/packages/flutter/lib/src/material/expansion_tile.dart b/packages/flutter/lib/src/material/expansion_tile.dart index 6756931c586..cfd820f388b 100644 --- a/packages/flutter/lib/src/material/expansion_tile.dart +++ b/packages/flutter/lib/src/material/expansion_tile.dart @@ -14,6 +14,7 @@ import 'list_tile_theme.dart'; import 'material.dart'; import 'material_localizations.dart'; import 'theme.dart'; +import 'theme_data.dart'; const Duration _kExpand = Duration(milliseconds: 200); @@ -248,6 +249,9 @@ class ExpansionTile extends StatefulWidget { 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 @@ class ExpansionTile extends StatefulWidget { /// 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 createState() => _ExpansionTileState(); } @@ -629,6 +644,7 @@ class _ExpansionTileState extends State with SingleTickerProvider case TargetPlatform.windows: break; } + return Container( clipBehavior: clipBehavior, decoration: ShapeDecoration( @@ -646,6 +662,9 @@ class _ExpansionTileState extends State with SingleTickerProvider 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 741787207d5..98d12151595 100644 --- a/packages/flutter/lib/src/material/list_tile.dart +++ b/packages/flutter/lib/src/material/list_tile.dart @@ -424,6 +424,7 @@ class ListTile extends StatelessWidget { /// 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 @@ class ListTile extends StatelessWidget { /// 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 9900a1101c9..79ba4356bfe 100644 --- a/packages/flutter/test/material/expansion_tile_test.dart +++ b/packages/flutter/test/material/expansion_tile_test.dart @@ -1198,4 +1198,38 @@ void main() { 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: [ + ExpansionTile( + dense: dense, + enableFeedback: enableFeedback, + visualDensity: visualDensity, + title: Text('Title', key: titleKey), + children: const [ + Text('Child 0'), + ], + ), + Text('Non descendant', key: nonDescendantKey), + ], + ), + ), + )); + + final Finder tileFinder = find.byType(ListTile); + final ListTile tileWidget = tester.widget(tileFinder); + expect(tileWidget.dense, dense); + expect(tileWidget.enableFeedback, enableFeedback); + expect(tileWidget.visualDensity, visualDensity); + }); }