Skip to content

Commit c1ce4e5

Browse files
authored
Fix IconButton.color overrided by IconButtomTheme (flutter#174515)
## Description This PR fixes IconButton icon color resolution. ## Before The IconButton.color property does not take precedence over the ambient `IconButtonTheme` ## After The IconButton.color property overrides the ambient `IconButtonTheme`. ## Related Issue Fixes [SnackBar closeIconColor does not respect widget override](flutter#174472) Fixes [IconButton.color is overidden by IconButtonTheme](flutter#174511) ## Tests Adds 1 test.
1 parent cc0b047 commit c1ce4e5

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

packages/flutter/lib/src/material/icon_button.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,9 @@ class IconButton extends StatelessWidget {
745745
if (style != null) {
746746
adjustedStyle = style!.merge(adjustedStyle);
747747
}
748-
748+
if (adjustedStyle.iconColor == null) {
749+
adjustedStyle = adjustedStyle.copyWith(iconColor: adjustedStyle.foregroundColor);
750+
}
749751
Widget effectiveIcon = icon;
750752
if ((isSelected ?? false) && selectedIcon != null) {
751753
effectiveIcon = selectedIcon!;

packages/flutter/test/material/icon_button_test.dart

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2761,6 +2761,37 @@ void main() {
27612761
expect(getOverlayColor(tester), paints..rect(color: overlayColor));
27622762
});
27632763

2764+
// Regression test for https://github.com/flutter/flutter/issues/174511.
2765+
testWidgets('IconButton.color takes precedence over ambient IconButtonThemeData.iconColor', (
2766+
WidgetTester tester,
2767+
) async {
2768+
const Color iconButtonColor = Color(0xFFFF1234);
2769+
2770+
await tester.pumpWidget(
2771+
MaterialApp(
2772+
theme: ThemeData(
2773+
iconButtonTheme: const IconButtonThemeData(
2774+
style: ButtonStyle(
2775+
iconColor: WidgetStateColor.fromMap(<WidgetStatesConstraint, Color>{
2776+
WidgetState.any: Colors.purple,
2777+
}),
2778+
),
2779+
),
2780+
),
2781+
home: Material(
2782+
child: Center(
2783+
child: IconButton(
2784+
onPressed: () {},
2785+
icon: const Icon(Icons.add, size: 64),
2786+
color: iconButtonColor,
2787+
),
2788+
),
2789+
),
2790+
),
2791+
);
2792+
expect(_iconStyle(tester, Icons.add)?.color, iconButtonColor);
2793+
});
2794+
27642795
group('IconTheme tests in Material 3', () {
27652796
testWidgets('IconTheme overrides default values in M3', (WidgetTester tester) async {
27662797
// Theme's IconTheme

0 commit comments

Comments
 (0)