From 3dc32873bfd9cbee2ee7854f93f7c6ee0f03ce79 Mon Sep 17 00:00:00 2001 From: Kyle Bradshaw Date: Wed, 22 Nov 2017 17:06:43 -0600 Subject: [PATCH] AnimationController reset() method (#13044) * AnimationController reset() method Just a simple convenience method to fix #13039 * Added `reset()` test * More test expectations Per feedback. * Removed test print * Improved documentation of reset() * Add controller.reverse to test --- .../src/animation/animation_controller.dart | 6 +++ .../animation/animation_controller_test.dart | 53 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/packages/flutter/lib/src/animation/animation_controller.dart b/packages/flutter/lib/src/animation/animation_controller.dart index f288443cc4..32ab062ff1 100644 --- a/packages/flutter/lib/src/animation/animation_controller.dart +++ b/packages/flutter/lib/src/animation/animation_controller.dart @@ -218,6 +218,12 @@ class AnimationController extends Animation notifyListeners(); _checkStatusChanged(); } + + /// Sets the controller's value to [lowerBound], stopping the animation (if + /// in progress), and resetting to its beginning point, or dismissed state. + void reset() { + value = lowerBound; + } /// The rate of change of [value] per second. /// diff --git a/packages/flutter/test/animation/animation_controller_test.dart b/packages/flutter/test/animation/animation_controller_test.dart index 97bb036c6a..fe9db2c701 100644 --- a/packages/flutter/test/animation/animation_controller_test.dart +++ b/packages/flutter/test/animation/animation_controller_test.dart @@ -396,6 +396,59 @@ void main() { expect(controller.value, 1.0); }); + test('resetting animation works at all phases', (){ + final List statusLog = []; + final AnimationController controller = new AnimationController( + duration: const Duration(milliseconds: 100), + value: 0.0, + lowerBound: 0.0, + upperBound: 1.0, + vsync: const TestVSync(), + )..addStatusListener(statusLog.add); + + expect(controller.value, 0.0); + expect(controller.status, AnimationStatus.dismissed); + + controller.reset(); + + expect(controller.value, 0.0); + expect(controller.status, AnimationStatus.dismissed); + + statusLog.clear(); + controller.forward(); + tick(const Duration(milliseconds: 0)); + tick(const Duration(milliseconds: 50)); + expect(controller.status, AnimationStatus.forward); + controller.reset(); + + expect(controller.value, 0.0); + expect(controller.status, AnimationStatus.dismissed); + expect(statusLog, equals([ AnimationStatus.forward, AnimationStatus.dismissed ])); + + controller.value = 1.0; + statusLog.clear(); + controller.reverse(); + tick(const Duration(milliseconds: 0)); + tick(const Duration(milliseconds: 50)); + expect(controller.status, AnimationStatus.reverse); + controller.reset(); + + expect(controller.value, 0.0); + expect(controller.status, AnimationStatus.dismissed); + expect(statusLog, equals([ AnimationStatus.reverse, AnimationStatus.dismissed ])); + + statusLog.clear(); + controller.forward(); + tick(const Duration(milliseconds: 0)); + tick(const Duration(milliseconds: 150)); + expect(controller.status, AnimationStatus.completed); + controller.reset(); + + expect(controller.value, 0.0); + expect(controller.status, AnimationStatus.dismissed); + expect(statusLog, equals([ AnimationStatus.forward, AnimationStatus.completed, AnimationStatus.dismissed ])); + }); + test('setting value directly sets correct status', () { final AnimationController controller = new AnimationController( value: 0.0,