From 4b07bd05bf3ff80e0a42eb95c18cc0d636f5c06f Mon Sep 17 00:00:00 2001 From: Soroush Yousefpour Date: Fri, 1 May 2026 07:19:21 +0200 Subject: [PATCH 1/3] Prevent Cubic transform from looping on out-of-range input --- packages/flutter/lib/src/animation/curves.dart | 6 ++++++ packages/flutter/test/animation/curves_test.dart | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packages/flutter/lib/src/animation/curves.dart b/packages/flutter/lib/src/animation/curves.dart index 3613736e01eca..fed169af14747 100644 --- a/packages/flutter/lib/src/animation/curves.dart +++ b/packages/flutter/lib/src/animation/curves.dart @@ -401,6 +401,12 @@ class Cubic extends Curve { @override double transformInternal(double t) { + if (t <= 0.0) { + return 0.0; + } + if (t >= 1.0) { + return 1.0; + } var start = 0.0; var end = 1.0; while (true) { diff --git a/packages/flutter/test/animation/curves_test.dart b/packages/flutter/test/animation/curves_test.dart index 92a7011c4a6af..99414e8cedabf 100644 --- a/packages/flutter/test/animation/curves_test.dart +++ b/packages/flutter/test/animation/curves_test.dart @@ -180,6 +180,12 @@ void main() { expect(test.transform(0.166666), equals(0.4)); }); + // Regression test for https://github.com/flutter/flutter/issues/171364. + test('Cubic transformInternal clamps values outside the unit interval', () { + expect(Curves.easeOut.transformInternal(2.0), 1.0); + expect(Curves.easeOut.transformInternal(-1.0), 0.0); + }); + test('Invalid transform parameter should assert', () { expect(() => const SawTooth(2).transform(-0.0001), throwsAssertionError); expect(() => const SawTooth(2).transform(1.0001), throwsAssertionError); From d73cd2095f67a7c98439662b959f14df26d7ed6b Mon Sep 17 00:00:00 2001 From: Soroush Yousefpour Date: Fri, 1 May 2026 07:28:40 +0200 Subject: [PATCH 2/3] Handle NaN in Cubic transformInternal --- packages/flutter/lib/src/animation/curves.dart | 2 +- packages/flutter/test/animation/curves_test.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/animation/curves.dart b/packages/flutter/lib/src/animation/curves.dart index fed169af14747..e5a19db3d90d1 100644 --- a/packages/flutter/lib/src/animation/curves.dart +++ b/packages/flutter/lib/src/animation/curves.dart @@ -401,7 +401,7 @@ class Cubic extends Curve { @override double transformInternal(double t) { - if (t <= 0.0) { + if (t.isNaN || t <= 0.0) { return 0.0; } if (t >= 1.0) { diff --git a/packages/flutter/test/animation/curves_test.dart b/packages/flutter/test/animation/curves_test.dart index 99414e8cedabf..5b622a61986ab 100644 --- a/packages/flutter/test/animation/curves_test.dart +++ b/packages/flutter/test/animation/curves_test.dart @@ -184,6 +184,7 @@ void main() { test('Cubic transformInternal clamps values outside the unit interval', () { expect(Curves.easeOut.transformInternal(2.0), 1.0); expect(Curves.easeOut.transformInternal(-1.0), 0.0); + expect(Curves.easeOut.transformInternal(double.nan), 0.0); }); test('Invalid transform parameter should assert', () { From 8640bb7c988c2b3614460094e1ab9378c7989432 Mon Sep 17 00:00:00 2001 From: Soroush Yousefpour Date: Tue, 12 May 2026 23:59:28 +0200 Subject: [PATCH 3/3] Throw for NaN cubic transforms --- packages/flutter/lib/src/animation/curves.dart | 5 ++++- packages/flutter/test/animation/curves_test.dart | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/animation/curves.dart b/packages/flutter/lib/src/animation/curves.dart index e5a19db3d90d1..1b8dc5dcf3128 100644 --- a/packages/flutter/lib/src/animation/curves.dart +++ b/packages/flutter/lib/src/animation/curves.dart @@ -401,7 +401,10 @@ class Cubic extends Curve { @override double transformInternal(double t) { - if (t.isNaN || t <= 0.0) { + if (t.isNaN) { + throw ArgumentError.value(t, 't', 'must not be NaN'); + } + if (t <= 0.0) { return 0.0; } if (t >= 1.0) { diff --git a/packages/flutter/test/animation/curves_test.dart b/packages/flutter/test/animation/curves_test.dart index 5b622a61986ab..e83e1d43235d0 100644 --- a/packages/flutter/test/animation/curves_test.dart +++ b/packages/flutter/test/animation/curves_test.dart @@ -184,7 +184,10 @@ void main() { test('Cubic transformInternal clamps values outside the unit interval', () { expect(Curves.easeOut.transformInternal(2.0), 1.0); expect(Curves.easeOut.transformInternal(-1.0), 0.0); - expect(Curves.easeOut.transformInternal(double.nan), 0.0); + }); + + test('Cubic transformInternal throws for NaN', () { + expect(() => Curves.easeOut.transformInternal(double.nan), throwsArgumentError); }); test('Invalid transform parameter should assert', () {