Commit cb2204d1 authored by Zev Youra's avatar Zev Youra Committed by Ian Hickson

Add IconThemeData adjustment to ListTile trailing element (#11858)

* Add IconThemeData adjustment to ListTile trailing element (makes consistent with leading element)

* Add test for ListTile theme changes

* Pull out and share IconThemeData variable between leading and trailing

* remove extra comma

* fix style nit
parent b5ea59d5
...@@ -387,9 +387,13 @@ class ListTile extends StatelessWidget { ...@@ -387,9 +387,13 @@ class ListTile extends StatelessWidget {
// Overall, the list tile is a Row() with these children. // Overall, the list tile is a Row() with these children.
final List<Widget> children = <Widget>[]; final List<Widget> children = <Widget>[];
IconThemeData iconThemeData;
if (leading != null || trailing != null)
iconThemeData = new IconThemeData(color: _iconColor(theme, tileTheme));
if (leading != null) { if (leading != null) {
children.add(IconTheme.merge( children.add(IconTheme.merge(
data: new IconThemeData(color: _iconColor(theme, tileTheme)), data: iconThemeData,
child: new Container( child: new Container(
margin: const EdgeInsetsDirectional.only(end: 16.0), margin: const EdgeInsetsDirectional.only(end: 16.0),
width: 40.0, width: 40.0,
...@@ -424,10 +428,14 @@ class ListTile extends StatelessWidget { ...@@ -424,10 +428,14 @@ class ListTile extends StatelessWidget {
)); ));
if (trailing != null) { if (trailing != null) {
children.add(new Container( children.add(IconTheme.merge(
margin: const EdgeInsetsDirectional.only(start: 16.0), data: iconThemeData,
alignment: FractionalOffsetDirectional.centerEnd, child: new Container(
child: trailing, margin: const EdgeInsetsDirectional.only(start: 16.0),
width: 40.0,
alignment: FractionalOffsetDirectional.centerEnd,
child: trailing,
),
)); ));
} }
......
...@@ -178,6 +178,8 @@ void main() { ...@@ -178,6 +178,8 @@ void main() {
testWidgets('ListTileTheme', (WidgetTester tester) async { testWidgets('ListTileTheme', (WidgetTester tester) async {
final Key titleKey = new UniqueKey(); final Key titleKey = new UniqueKey();
final Key subtitleKey = new UniqueKey(); final Key subtitleKey = new UniqueKey();
final Key leadingKey = new UniqueKey();
final Key trailingKey = new UniqueKey();
ThemeData theme; ThemeData theme;
Widget buildFrame({ Widget buildFrame({
...@@ -202,7 +204,8 @@ void main() { ...@@ -202,7 +204,8 @@ void main() {
return new ListTile( return new ListTile(
enabled: enabled, enabled: enabled,
selected: selected, selected: selected,
leading: const TestIcon(), leading: new TestIcon(key: leadingKey),
trailing: new TestIcon(key: trailingKey),
title: new TestText('title', key: titleKey), title: new TestText('title', key: titleKey),
subtitle: new TestText('subtitle', key: subtitleKey), subtitle: new TestText('subtitle', key: subtitleKey),
); );
...@@ -217,35 +220,39 @@ void main() { ...@@ -217,35 +220,39 @@ void main() {
const Color green = const Color(0xFF00FF00); const Color green = const Color(0xFF00FF00);
const Color red = const Color(0xFFFF0000); const Color red = const Color(0xFFFF0000);
Color iconColor() => tester.state<TestIconState>(find.byType(TestIcon)).iconTheme.color; Color iconColor(Key key) => tester.state<TestIconState>(find.byKey(key)).iconTheme.color;
Color textColor(Key key) => tester.state<TestTextState>(find.byKey(key)).textStyle.color; Color textColor(Key key) => tester.state<TestTextState>(find.byKey(key)).textStyle.color;
// A selected ListTile's leading and text get the primary color by default // A selected ListTile's leading, trailing, and text get the primary color by default
await(tester.pumpWidget(buildFrame(selected: true))); await(tester.pumpWidget(buildFrame(selected: true)));
await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate
expect(iconColor(), theme.primaryColor); expect(iconColor(leadingKey), theme.primaryColor);
expect(iconColor(trailingKey), theme.primaryColor);
expect(textColor(titleKey), theme.primaryColor); expect(textColor(titleKey), theme.primaryColor);
expect(textColor(subtitleKey), theme.primaryColor); expect(textColor(subtitleKey), theme.primaryColor);
// A selected ListTile's leading and text get the ListTileTheme's selectedColor // A selected ListTile's leading, trailing, and text get the ListTileTheme's selectedColor
await(tester.pumpWidget(buildFrame(selected: true, selectedColor: green))); await(tester.pumpWidget(buildFrame(selected: true, selectedColor: green)));
await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate
expect(iconColor(), green); expect(iconColor(leadingKey), green);
expect(iconColor(trailingKey), green);
expect(textColor(titleKey), green); expect(textColor(titleKey), green);
expect(textColor(subtitleKey), green); expect(textColor(subtitleKey), green);
// An unselected ListTile's leading icon gets the ListTileTheme's iconColor // An unselected ListTile's leading and trailing get the ListTileTheme's iconColor
// An unselected ListTile's title texts get the ListTileTheme's textColor // An unselected ListTile's title texts get the ListTileTheme's textColor
await(tester.pumpWidget(buildFrame(iconColor: red, textColor: green))); await(tester.pumpWidget(buildFrame(iconColor: red, textColor: green)));
await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate
expect(iconColor(), red); expect(iconColor(leadingKey), red);
expect(iconColor(trailingKey), red);
expect(textColor(titleKey), green); expect(textColor(titleKey), green);
expect(textColor(subtitleKey), green); expect(textColor(subtitleKey), green);
// If the item is disabled it's rendered with the theme's disabled color. // If the item is disabled it's rendered with the theme's disabled color.
await(tester.pumpWidget(buildFrame(enabled: false))); await(tester.pumpWidget(buildFrame(enabled: false)));
await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate
expect(iconColor(), theme.disabledColor); expect(iconColor(leadingKey), theme.disabledColor);
expect(iconColor(trailingKey), theme.disabledColor);
expect(textColor(titleKey), theme.disabledColor); expect(textColor(titleKey), theme.disabledColor);
expect(textColor(subtitleKey), theme.disabledColor); expect(textColor(subtitleKey), theme.disabledColor);
...@@ -253,7 +260,8 @@ void main() { ...@@ -253,7 +260,8 @@ void main() {
// Even if it's selected. // Even if it's selected.
await(tester.pumpWidget(buildFrame(enabled: false, selected: true))); await(tester.pumpWidget(buildFrame(enabled: false, selected: true)));
await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate await(tester.pump(const Duration(milliseconds: 300))); // DefaultTextStyle changes animate
expect(iconColor(), theme.disabledColor); expect(iconColor(leadingKey), theme.disabledColor);
expect(iconColor(trailingKey), theme.disabledColor);
expect(textColor(titleKey), theme.disabledColor); expect(textColor(titleKey), theme.disabledColor);
expect(textColor(subtitleKey), theme.disabledColor); expect(textColor(subtitleKey), theme.disabledColor);
}); });
......
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