From 4b87e334d776a9ec75338be44b07346b167846ec Mon Sep 17 00:00:00 2001 From: Chema Molins Date: Wed, 2 Jan 2019 19:49:59 +0100 Subject: [PATCH] Setting icon color to first ListTile in ExpansionTile. Fixes #23053 (#23118) --- AUTHORS | 1 + .../lib/src/material/expansion_tile.dart | 11 +-- .../test/material/expansion_tile_test.dart | 99 +++++++++++++++++++ 3 files changed, 104 insertions(+), 7 deletions(-) diff --git a/AUTHORS b/AUTHORS index 433846e4e9..67cc5d456d 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,6 +28,7 @@ Christian Mürtz Lukasz Piliszczuk Felix Schmidt Artur Rymarz +Chema Molins Stefan Mitev Jasper van Riet Mattijs Fuijkschot diff --git a/packages/flutter/lib/src/material/expansion_tile.dart b/packages/flutter/lib/src/material/expansion_tile.dart index b9f91416f0..5e9778f043 100644 --- a/packages/flutter/lib/src/material/expansion_tile.dart +++ b/packages/flutter/lib/src/material/expansion_tile.dart @@ -142,7 +142,6 @@ class _ExpansionTileState extends State with SingleTickerProvider Widget _buildChildren(BuildContext context, Widget child) { final Color borderSideColor = _borderColor.value ?? Colors.transparent; - final Color titleColor = _headerColor.value; return Container( decoration: BoxDecoration( @@ -155,15 +154,13 @@ class _ExpansionTileState extends State with SingleTickerProvider child: Column( mainAxisSize: MainAxisSize.min, children: [ - IconTheme.merge( - data: IconThemeData(color: _iconColor.value), + ListTileTheme.merge( + iconColor: _iconColor.value, + textColor: _headerColor.value, child: ListTile( onTap: _handleTap, leading: widget.leading, - title: DefaultTextStyle( - style: Theme.of(context).textTheme.subhead.copyWith(color: titleColor), - child: widget.title, - ), + title: widget.title, trailing: widget.trailing ?? RotationTransition( turns: _iconTurns, child: const Icon(Icons.expand_more), diff --git a/packages/flutter/test/material/expansion_tile_test.dart b/packages/flutter/test/material/expansion_tile_test.dart index cd7313a17a..00956c0194 100644 --- a/packages/flutter/test/material/expansion_tile_test.dart +++ b/packages/flutter/test/material/expansion_tile_test.dart @@ -6,8 +6,47 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter/material.dart'; +class TestIcon extends StatefulWidget { + const TestIcon({Key key}) : super(key: key); + + @override + TestIconState createState() => TestIconState(); +} + +class TestIconState extends State { + IconThemeData iconTheme; + + @override + Widget build(BuildContext context) { + iconTheme = IconTheme.of(context); + return const Icon(Icons.expand_more); + } +} + +class TestText extends StatefulWidget { + const TestText(this.text, {Key key}) : super(key: key); + + final String text; + + @override + TestTextState createState() => TestTextState(); +} + +class TestTextState extends State { + TextStyle textStyle; + + @override + Widget build(BuildContext context) { + textStyle = DefaultTextStyle.of(context).style; + return Text(widget.text); + } +} + void main() { const Color _dividerColor = Color(0x1f333333); + const Color _accentColor = Colors.blueAccent; + const Color _unselectedWidgetColor = Colors.black54; + const Color _headerColor = Colors.black45; testWidgets('ExpansionTile initial state', (WidgetTester tester) async { final Key topKey = UniqueKey(); @@ -116,4 +155,64 @@ void main() { expect(collapsedContainerDecoration.border.top.color, _dividerColor); expect(collapsedContainerDecoration.border.bottom.color, _dividerColor); }); + + testWidgets('ListTileTheme', (WidgetTester tester) async { + final Key expandedTitleKey = UniqueKey(); + final Key collapsedTitleKey = UniqueKey(); + final Key expandedIconKey = UniqueKey(); + final Key collapsedIconKey = UniqueKey(); + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + platform: TargetPlatform.iOS, + accentColor: _accentColor, + unselectedWidgetColor: _unselectedWidgetColor, + textTheme: const TextTheme(subhead: TextStyle(color: _headerColor)), + ), + home: Material( + child: SingleChildScrollView( + child: Column( + children: [ + const ListTile(title: Text('Top')), + ExpansionTile( + initiallyExpanded: true, + title: TestText('Expanded', key: expandedTitleKey), + backgroundColor: Colors.red, + children: const [ListTile(title: Text('0'))], + trailing: TestIcon(key: expandedIconKey), + ), + ExpansionTile( + initiallyExpanded: false, + title: TestText('Collapsed', key: collapsedTitleKey), + children: const [ListTile(title: Text('0'))], + trailing: TestIcon(key: collapsedIconKey), + ), + ], + ), + ), + ), + ), + ); + + Color iconColor(Key key) => tester.state(find.byKey(key)).iconTheme.color; + Color textColor(Key key) => tester.state(find.byKey(key)).textStyle.color; + + expect(textColor(expandedTitleKey), _accentColor); + expect(textColor(collapsedTitleKey), _headerColor); + expect(iconColor(expandedIconKey), _accentColor); + expect(iconColor(collapsedIconKey), _unselectedWidgetColor); + + // Tap both tiles to change their state: collapse and extend respectively + await tester.tap(find.text('Expanded')); + await tester.tap(find.text('Collapsed')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + await tester.pump(const Duration(seconds: 1)); + + expect(textColor(expandedTitleKey), _headerColor); + expect(textColor(collapsedTitleKey), _accentColor); + expect(iconColor(expandedIconKey), _unselectedWidgetColor); + expect(iconColor(collapsedIconKey), _accentColor); + }); }