diff --git a/packages/flutter/lib/src/material/action_icons_theme.dart b/packages/flutter/lib/src/material/action_icons_theme.dart index ecb001854a..7dd698793d 100644 --- a/packages/flutter/lib/src/material/action_icons_theme.dart +++ b/packages/flutter/lib/src/material/action_icons_theme.dart @@ -55,10 +55,10 @@ class ActionIconThemeData with Diagnosticable { WidgetBuilder? endDrawerButtonIconBuilder, }) { return ActionIconThemeData( - backButtonIconBuilder: backButtonIconBuilder ?? backButtonIconBuilder, - closeButtonIconBuilder: closeButtonIconBuilder ?? closeButtonIconBuilder, - drawerButtonIconBuilder: drawerButtonIconBuilder ?? drawerButtonIconBuilder, - endDrawerButtonIconBuilder: endDrawerButtonIconBuilder ?? endDrawerButtonIconBuilder, + backButtonIconBuilder: backButtonIconBuilder ?? this.backButtonIconBuilder, + closeButtonIconBuilder: closeButtonIconBuilder ?? this.closeButtonIconBuilder, + drawerButtonIconBuilder: drawerButtonIconBuilder ?? this.drawerButtonIconBuilder, + endDrawerButtonIconBuilder: endDrawerButtonIconBuilder ?? this.endDrawerButtonIconBuilder, ); } diff --git a/packages/flutter/test/material/action_icons_theme_test.dart b/packages/flutter/test/material/action_icons_theme_test.dart index 0c1788e54d..c5e1ddd6da 100644 --- a/packages/flutter/test/material/action_icons_theme_test.dart +++ b/packages/flutter/test/material/action_icons_theme_test.dart @@ -15,6 +15,42 @@ void main() { const ActionIconThemeData().copyWith().hashCode); }); + testWidgets('ActionIconThemeData copyWith overrides all properties', (WidgetTester tester) async { + // This is a regression test for https://github.com/flutter/flutter/issues/126762. + Widget originalButtonBuilder(BuildContext context) { + return const SizedBox(); + } + Widget newButtonBuilder(BuildContext context) { + return const Icon(Icons.add); + } + + // Create a ActionIconThemeData with all properties set. + final ActionIconThemeData original = ActionIconThemeData( + backButtonIconBuilder: originalButtonBuilder, + closeButtonIconBuilder: originalButtonBuilder, + drawerButtonIconBuilder: originalButtonBuilder, + endDrawerButtonIconBuilder: originalButtonBuilder, + ); + // Check if the all properties are copied. + final ActionIconThemeData copy = original.copyWith(); + expect(copy.backButtonIconBuilder, originalButtonBuilder); + expect(copy.closeButtonIconBuilder, originalButtonBuilder); + expect(copy.drawerButtonIconBuilder, originalButtonBuilder); + expect(copy.endDrawerButtonIconBuilder, originalButtonBuilder); + + // Check if the properties are overriden. + final ActionIconThemeData overridden = original.copyWith( + backButtonIconBuilder: newButtonBuilder, + closeButtonIconBuilder: newButtonBuilder, + drawerButtonIconBuilder: newButtonBuilder, + endDrawerButtonIconBuilder: newButtonBuilder, + ); + expect(overridden.backButtonIconBuilder, newButtonBuilder); + expect(overridden.closeButtonIconBuilder, newButtonBuilder); + expect(overridden.drawerButtonIconBuilder, newButtonBuilder); + expect(overridden.endDrawerButtonIconBuilder, newButtonBuilder); + }); + test('ActionIconThemeData defaults', () { const ActionIconThemeData themeData = ActionIconThemeData(); expect(themeData.backButtonIconBuilder, null);