From f3725d0a4b9d3a180cce20db2f2182d37a65386d Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Mon, 15 Mar 2021 14:31:46 -0700 Subject: [PATCH] Fix bug in ButtonStyle.lerp(), in _LerpSides (#78051) --- .../lib/src/material/button_style.dart | 2 +- .../test/material/button_style_test.dart | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/material/button_style.dart b/packages/flutter/lib/src/material/button_style.dart index fbcf85b36e..e72efa3246 100644 --- a/packages/flutter/lib/src/material/button_style.dart +++ b/packages/flutter/lib/src/material/button_style.dart @@ -475,7 +475,7 @@ class _LerpSides implements MaterialStateProperty { if (resolvedA == null) return BorderSide.lerp(BorderSide(width: 0, color: resolvedB!.color.withAlpha(0)), resolvedB, t); if (resolvedB == null) - return BorderSide.lerp(BorderSide(width: 0, color: resolvedA.color.withAlpha(0)), resolvedA, t); + return BorderSide.lerp(resolvedA, BorderSide(width: 0, color: resolvedA.color.withAlpha(0)), t); return BorderSide.lerp(resolvedA, resolvedB, t); } } diff --git a/packages/flutter/test/material/button_style_test.dart b/packages/flutter/test/material/button_style_test.dart index 8229675eb2..06ce454696 100644 --- a/packages/flutter/test/material/button_style_test.dart +++ b/packages/flutter/test/material/button_style_test.dart @@ -151,4 +151,38 @@ void main() { style.merge(const ButtonStyle()) ); }); + + test('ButtonStyle.lerp BorderSide', () { + // This is regression test for https://github.com/flutter/flutter/pull/78051 + expect(ButtonStyle.lerp(null, null, 0), null); + expect(ButtonStyle.lerp(null, null, 0.5), null); + expect(ButtonStyle.lerp(null, null, 1), null); + + const BorderSide blackSide = BorderSide(width: 1, color: Color(0xFF000000)); + const BorderSide whiteSide = BorderSide(width: 1, color: Color(0xFFFFFFFF)); + const BorderSide emptyBlackSide = BorderSide(width: 0, color: Color(0x00000000)); + + final ButtonStyle blackStyle = ButtonStyle(side: MaterialStateProperty.all(blackSide)); + final ButtonStyle whiteStyle = ButtonStyle(side: MaterialStateProperty.all(whiteSide)); + + // MaterialState.all(value) properties resolve to value + // for any set of MaterialStates. + const Set states = { }; + + expect(ButtonStyle.lerp(blackStyle, blackStyle, 0)?.side?.resolve(states), blackSide); + expect(ButtonStyle.lerp(blackStyle, blackStyle, 0.5)?.side?.resolve(states), blackSide); + expect(ButtonStyle.lerp(blackStyle, blackStyle, 1)?.side?.resolve(states), blackSide); + + expect(ButtonStyle.lerp(blackStyle, null, 0)?.side?.resolve(states), blackSide); + expect(ButtonStyle.lerp(blackStyle, null, 0.5)?.side?.resolve(states), BorderSide.lerp(blackSide, emptyBlackSide, 0.5)); + expect(ButtonStyle.lerp(blackStyle, null, 1)?.side?.resolve(states), emptyBlackSide); + + expect(ButtonStyle.lerp(null, blackStyle, 0)?.side?.resolve(states), emptyBlackSide); + expect(ButtonStyle.lerp(null, blackStyle, 0.5)?.side?.resolve(states), BorderSide.lerp(emptyBlackSide, blackSide, 0.5)); + expect(ButtonStyle.lerp(null, blackStyle, 1)?.side?.resolve(states), blackSide); + + expect(ButtonStyle.lerp(blackStyle, whiteStyle, 0)?.side?.resolve(states), blackSide); + expect(ButtonStyle.lerp(blackStyle, whiteStyle, 0.5)?.side?.resolve(states), BorderSide.lerp(blackSide, whiteSide, 0.5)); + expect(ButtonStyle.lerp(blackStyle, whiteStyle, 1)?.side?.resolve(states), whiteSide); + }); }