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