From c1ce4e530c273e8d8752fea7869bd2e2f37eb313 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Fri, 5 Sep 2025 00:17:25 +0200 Subject: [PATCH] Fix IconButton.color overrided by IconButtomTheme (#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](https://github.com/flutter/flutter/issues/174472) Fixes [IconButton.color is overidden by IconButtonTheme](https://github.com/flutter/flutter/issues/174511) ## Tests Adds 1 test. --- .../flutter/lib/src/material/icon_button.dart | 4 ++- .../test/material/icon_button_test.dart | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/material/icon_button.dart b/packages/flutter/lib/src/material/icon_button.dart index 255478aeb2c..b6cf9e01083 100644 --- a/packages/flutter/lib/src/material/icon_button.dart +++ b/packages/flutter/lib/src/material/icon_button.dart @@ -745,7 +745,9 @@ class IconButton extends StatelessWidget { if (style != null) { adjustedStyle = style!.merge(adjustedStyle); } - + if (adjustedStyle.iconColor == null) { + adjustedStyle = adjustedStyle.copyWith(iconColor: adjustedStyle.foregroundColor); + } Widget effectiveIcon = icon; if ((isSelected ?? false) && selectedIcon != null) { effectiveIcon = selectedIcon!; diff --git a/packages/flutter/test/material/icon_button_test.dart b/packages/flutter/test/material/icon_button_test.dart index 82e50240d04..e649078f3f3 100644 --- a/packages/flutter/test/material/icon_button_test.dart +++ b/packages/flutter/test/material/icon_button_test.dart @@ -2761,6 +2761,37 @@ void main() { expect(getOverlayColor(tester), paints..rect(color: overlayColor)); }); + // Regression test for https://github.com/flutter/flutter/issues/174511. + testWidgets('IconButton.color takes precedence over ambient IconButtonThemeData.iconColor', ( + WidgetTester tester, + ) async { + const Color iconButtonColor = Color(0xFFFF1234); + + await tester.pumpWidget( + MaterialApp( + theme: ThemeData( + iconButtonTheme: const IconButtonThemeData( + style: ButtonStyle( + iconColor: WidgetStateColor.fromMap({ + WidgetState.any: Colors.purple, + }), + ), + ), + ), + home: Material( + child: Center( + child: IconButton( + onPressed: () {}, + icon: const Icon(Icons.add, size: 64), + color: iconButtonColor, + ), + ), + ), + ), + ); + expect(_iconStyle(tester, Icons.add)?.color, iconButtonColor); + }); + group('IconTheme tests in Material 3', () { testWidgets('IconTheme overrides default values in M3', (WidgetTester tester) async { // Theme's IconTheme