From d89deb79d36eefa5d7f4b5f6b2526ed7937ff3ec Mon Sep 17 00:00:00 2001 From: Keenan Date: Wed, 21 Mar 2018 18:54:14 -0500 Subject: [PATCH] Fix call on null when interpolating gradient stops (#15656) Also adds test for interpolating gradient stops. --- .../flutter/lib/src/painting/gradient.dart | 1 + .../flutter/test/painting/gradient_test.dart | 82 +++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/packages/flutter/lib/src/painting/gradient.dart b/packages/flutter/lib/src/painting/gradient.dart index e72c483fbc..7b785fc89b 100644 --- a/packages/flutter/lib/src/painting/gradient.dart +++ b/packages/flutter/lib/src/painting/gradient.dart @@ -28,6 +28,7 @@ _ColorsAndStops _interpolateColorsAndStops(List aColors, List aSt aStops ??= const [0.0, 1.0]; bStops ??= const [0.0, 1.0]; assert(aStops.length == bStops.length); + interpolatedStops = []; for (int i = 0; i < aStops.length; i += 1) interpolatedStops.add(ui.lerpDouble(aStops[i], bStops[i], t).clamp(0.0, 1.0)); } diff --git a/packages/flutter/test/painting/gradient_test.dart b/packages/flutter/test/painting/gradient_test.dart index b35c974447..166a971a8a 100644 --- a/packages/flutter/test/painting/gradient_test.dart +++ b/packages/flutter/test/painting/gradient_test.dart @@ -58,6 +58,47 @@ void main() { )); }); + test('LinearGradient lerp test with stops', () { + const LinearGradient testGradient1 = const LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomLeft, + colors: const [ + const Color(0x33333333), + const Color(0x66666666), + ], + stops: const [ + 0.0, + 0.5, + ], + ); + const LinearGradient testGradient2 = const LinearGradient( + begin: Alignment.topRight, + end: Alignment.topLeft, + colors: const [ + const Color(0x44444444), + const Color(0x88888888), + ], + stops: const [ + 0.5, + 1.0, + ], + ); + + final LinearGradient actual = LinearGradient.lerp(testGradient1, testGradient2, 0.5); + expect(actual, const LinearGradient( + begin: const Alignment(0.0, -1.0), + end: const Alignment(-1.0, 0.0), + colors: const [ + const Color(0x3B3B3B3B), + const Color(0x77777777), + ], + stops: const [ + 0.25, + 0.75, + ], + )); + }); + test('LinearGradient toString', () { expect( const LinearGradient( @@ -181,6 +222,47 @@ void main() { )); }); + test('RadialGradient lerp test with stops', () { + const RadialGradient testGradient1 = const RadialGradient( + center: Alignment.topLeft, + radius: 20.0, + colors: const [ + const Color(0x33333333), + const Color(0x66666666), + ], + stops: const [ + 0.0, + 0.5, + ], + ); + const RadialGradient testGradient2 = const RadialGradient( + center: Alignment.topRight, + radius: 10.0, + colors: const [ + const Color(0x44444444), + const Color(0x88888888), + ], + stops: const [ + 0.5, + 1.0, + ], + ); + + final RadialGradient actual = RadialGradient.lerp(testGradient1, testGradient2, 0.5); + expect(actual, const RadialGradient( + center: const Alignment(0.0, -1.0), + radius: 15.0, + colors: const [ + const Color(0x3B3B3B3B), + const Color(0x77777777), + ], + stops: const [ + 0.25, + 0.75, + ], + )); + }); + test('Gradient lerp test (with RadialGradient)', () { const RadialGradient testGradient1 = const RadialGradient( center: Alignment.topLeft,