Unverified Commit 02b2c2cd authored by Taha Tesser's avatar Taha Tesser Committed by GitHub

Fix `IconTheme` is not inherited when `Icon` is provided to `ListTile.title`...

Fix `IconTheme` is not inherited when `Icon` is provided to `ListTile.title` and `ListTile.subtitle` (#100757)
parent 89cc0200
...@@ -694,11 +694,10 @@ class ListTile extends StatelessWidget { ...@@ -694,11 +694,10 @@ class ListTile extends StatelessWidget {
assert(debugCheckHasMaterial(context)); assert(debugCheckHasMaterial(context));
final ThemeData theme = Theme.of(context); final ThemeData theme = Theme.of(context);
final ListTileThemeData tileTheme = ListTileTheme.of(context); final ListTileThemeData tileTheme = ListTileTheme.of(context);
final IconThemeData iconThemeData = IconThemeData(color: _iconColor(theme, tileTheme));
IconThemeData? iconThemeData;
TextStyle? leadingAndTrailingTextStyle; TextStyle? leadingAndTrailingTextStyle;
if (leading != null || trailing != null) { if (leading != null || trailing != null) {
iconThemeData = IconThemeData(color: _iconColor(theme, tileTheme));
leadingAndTrailingTextStyle = _trailingAndLeadingTextStyle(theme, tileTheme); leadingAndTrailingTextStyle = _trailingAndLeadingTextStyle(theme, tileTheme);
} }
...@@ -707,10 +706,7 @@ class ListTile extends StatelessWidget { ...@@ -707,10 +706,7 @@ class ListTile extends StatelessWidget {
leadingIcon = AnimatedDefaultTextStyle( leadingIcon = AnimatedDefaultTextStyle(
style: leadingAndTrailingTextStyle!, style: leadingAndTrailingTextStyle!,
duration: kThemeChangeDuration, duration: kThemeChangeDuration,
child: IconTheme.merge( child: leading!,
data: iconThemeData!,
child: leading!,
),
); );
} }
...@@ -737,10 +733,7 @@ class ListTile extends StatelessWidget { ...@@ -737,10 +733,7 @@ class ListTile extends StatelessWidget {
trailingIcon = AnimatedDefaultTextStyle( trailingIcon = AnimatedDefaultTextStyle(
style: leadingAndTrailingTextStyle!, style: leadingAndTrailingTextStyle!,
duration: kThemeChangeDuration, duration: kThemeChangeDuration,
child: IconTheme.merge( child: trailing!,
data: iconThemeData!,
child: trailing!,
),
); );
} }
...@@ -782,20 +775,23 @@ class ListTile extends StatelessWidget { ...@@ -782,20 +775,23 @@ class ListTile extends StatelessWidget {
top: false, top: false,
bottom: false, bottom: false,
minimum: resolvedContentPadding, minimum: resolvedContentPadding,
child: _ListTile( child: IconTheme.merge(
leading: leadingIcon, data: iconThemeData,
title: titleText, child: _ListTile(
subtitle: subtitleText, leading: leadingIcon,
trailing: trailingIcon, title: titleText,
isDense: _isDenseLayout(theme, tileTheme), subtitle: subtitleText,
visualDensity: visualDensity ?? tileTheme.visualDensity ?? theme.visualDensity, trailing: trailingIcon,
isThreeLine: isThreeLine, isDense: _isDenseLayout(theme, tileTheme),
textDirection: textDirection, visualDensity: visualDensity ?? tileTheme.visualDensity ?? theme.visualDensity,
titleBaselineType: titleStyle.textBaseline!, isThreeLine: isThreeLine,
subtitleBaselineType: subtitleStyle?.textBaseline, textDirection: textDirection,
horizontalTitleGap: horizontalTitleGap ?? tileTheme.horizontalTitleGap ?? 16, titleBaselineType: titleStyle.textBaseline!,
minVerticalPadding: minVerticalPadding ?? tileTheme.minVerticalPadding ?? 4, subtitleBaselineType: subtitleStyle?.textBaseline,
minLeadingWidth: minLeadingWidth ?? tileTheme.minLeadingWidth ?? 40, horizontalTitleGap: horizontalTitleGap ?? tileTheme.horizontalTitleGap ?? 16,
minVerticalPadding: minVerticalPadding ?? tileTheme.minVerticalPadding ?? 4,
minLeadingWidth: minLeadingWidth ?? tileTheme.minLeadingWidth ?? 40,
),
), ),
), ),
), ),
......
...@@ -2085,6 +2085,8 @@ void main() { ...@@ -2085,6 +2085,8 @@ void main() {
const ColorScheme lightColorScheme = ColorScheme.light(); const ColorScheme lightColorScheme = ColorScheme.light();
const ColorScheme darkColorScheme = ColorScheme.dark(); const ColorScheme darkColorScheme = ColorScheme.dark();
final Key leadingKey = UniqueKey(); final Key leadingKey = UniqueKey();
final Key titleKey = UniqueKey();
final Key subtitleKey = UniqueKey();
final Key trailingKey = UniqueKey(); final Key trailingKey = UniqueKey();
Widget buildFrame({ required Brightness brightness, required bool selected }) { Widget buildFrame({ required Brightness brightness, required bool selected }) {
...@@ -2098,6 +2100,8 @@ void main() { ...@@ -2098,6 +2100,8 @@ void main() {
child: ListTile( child: ListTile(
selected: selected, selected: selected,
leading: TestIcon(key: leadingKey), leading: TestIcon(key: leadingKey),
title: TestIcon(key: titleKey),
subtitle: TestIcon(key: subtitleKey),
trailing: TestIcon(key: trailingKey), trailing: TestIcon(key: trailingKey),
), ),
), ),
...@@ -2109,21 +2113,29 @@ void main() { ...@@ -2109,21 +2113,29 @@ void main() {
await tester.pumpWidget(buildFrame(brightness: Brightness.light, selected: true)); await tester.pumpWidget(buildFrame(brightness: Brightness.light, selected: true));
expect(iconColor(leadingKey), lightColorScheme.primary); expect(iconColor(leadingKey), lightColorScheme.primary);
expect(iconColor(titleKey), lightColorScheme.primary);
expect(iconColor(subtitleKey), lightColorScheme.primary);
expect(iconColor(trailingKey), lightColorScheme.primary); expect(iconColor(trailingKey), lightColorScheme.primary);
await tester.pumpWidget(buildFrame(brightness: Brightness.light, selected: false)); await tester.pumpWidget(buildFrame(brightness: Brightness.light, selected: false));
expect(iconColor(leadingKey), Colors.black45); expect(iconColor(leadingKey), Colors.black45);
expect(iconColor(titleKey), Colors.black45);
expect(iconColor(subtitleKey), Colors.black45);
expect(iconColor(trailingKey), Colors.black45); expect(iconColor(trailingKey), Colors.black45);
await tester.pumpWidget(buildFrame(brightness: Brightness.dark, selected: true)); await tester.pumpWidget(buildFrame(brightness: Brightness.dark, selected: true));
await tester.pumpAndSettle(); // Animated theme change await tester.pumpAndSettle(); // Animated theme change
expect(iconColor(leadingKey), darkColorScheme.primary); expect(iconColor(leadingKey), darkColorScheme.primary);
expect(iconColor(titleKey), darkColorScheme.primary);
expect(iconColor(subtitleKey), darkColorScheme.primary);
expect(iconColor(trailingKey), darkColorScheme.primary); expect(iconColor(trailingKey), darkColorScheme.primary);
// For this configuration, ListTile defers to the default IconTheme. // For this configuration, ListTile defers to the default IconTheme.
// The default dark theme's IconTheme has color:white // The default dark theme's IconTheme has color:white
await tester.pumpWidget(buildFrame(brightness: Brightness.dark, selected: false)); await tester.pumpWidget(buildFrame(brightness: Brightness.dark, selected: false));
expect(iconColor(leadingKey), Colors.white); expect(iconColor(leadingKey), Colors.white);
expect(iconColor(titleKey), Colors.white);
expect(iconColor(subtitleKey), Colors.white);
expect(iconColor(trailingKey), Colors.white); expect(iconColor(trailingKey), Colors.white);
}); });
} }
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