Commit 6f7ceff0 authored by Adam Barth's avatar Adam Barth

Merge pull request #2235 from abarth/animation_status

Elide fewer AnimationStatus callbacks
parents c56be8ef 25ab5555
...@@ -146,6 +146,7 @@ class AnimationController extends Animation<double> ...@@ -146,6 +146,7 @@ class AnimationController extends Animation<double>
stop(); stop();
if (simulationDuration == Duration.ZERO) { if (simulationDuration == Duration.ZERO) {
assert(value == target); assert(value == target);
_checkStatusChanged();
return new Future.value(); return new Future.value();
} }
assert(simulationDuration > Duration.ZERO); assert(simulationDuration > Duration.ZERO);
...@@ -180,7 +181,9 @@ class AnimationController extends Animation<double> ...@@ -180,7 +181,9 @@ class AnimationController extends Animation<double>
assert(!isAnimating); assert(!isAnimating);
_simulation = simulation; _simulation = simulation;
_value = simulation.x(0.0).clamp(lowerBound, upperBound); _value = simulation.x(0.0).clamp(lowerBound, upperBound);
return _ticker.start(); Future result = _ticker.start();
_checkStatusChanged();
return result;
} }
/// Stops running this animation. /// Stops running this animation.
...@@ -194,13 +197,13 @@ class AnimationController extends Animation<double> ...@@ -194,13 +197,13 @@ class AnimationController extends Animation<double>
stop(); stop();
} }
AnimationStatus _lastStatus = AnimationStatus.dismissed; AnimationStatus _lastReportedStatus = AnimationStatus.dismissed;
void _checkStatusChanged() { void _checkStatusChanged() {
AnimationStatus newStatus = status; AnimationStatus newStatus = status;
AnimationStatus oldStatus = _lastStatus; if (_lastReportedStatus != newStatus) {
_lastStatus = newStatus; _lastReportedStatus = newStatus;
if (oldStatus != newStatus)
notifyStatusListeners(newStatus); notifyStatusListeners(newStatus);
}
} }
void _tick(Duration elapsed) { void _tick(Duration elapsed) {
......
...@@ -22,9 +22,9 @@ class OverlayEntry { ...@@ -22,9 +22,9 @@ class OverlayEntry {
bool get opaque => _opaque; bool get opaque => _opaque;
bool _opaque; bool _opaque;
void set opaque (bool value) { void set opaque (bool value) {
assert(_overlay != null);
if (_opaque == value) if (_opaque == value)
return; return;
assert(_overlay != null);
_overlay.setState(() { _overlay.setState(() {
_opaque = value; _opaque = value;
}); });
......
...@@ -36,5 +36,70 @@ void main() { ...@@ -36,5 +36,70 @@ void main() {
Scheduler.instance.handleBeginFrame(const Duration(seconds: 2)); Scheduler.instance.handleBeginFrame(const Duration(seconds: 2));
expect(didComplete, isTrue); expect(didComplete, isTrue);
expect(didDismiss, isTrue); expect(didDismiss, isTrue);
controller.stop();
});
test("Receives status callbacks for forward and reverse", () {
WidgetFlutterBinding.ensureInitialized();
AnimationController controller = new AnimationController(
duration: const Duration(milliseconds: 100)
);
List<double> valueLog = <double>[];
List<AnimationStatus> log = <AnimationStatus>[];
controller
..addStatusListener((AnimationStatus status) {
log.add(status);
})
..addListener(() {
valueLog.add(controller.value);
});
expect(log, equals([]));
expect(valueLog, equals([]));
controller.forward();
expect(log, equals([AnimationStatus.forward]));
expect(valueLog, equals([]));
controller.reverse();
expect(log, equals([AnimationStatus.forward, AnimationStatus.dismissed]));
expect(valueLog, equals([]));
controller.reverse();
expect(log, equals([AnimationStatus.forward, AnimationStatus.dismissed]));
expect(valueLog, equals([]));
log.clear();
controller.forward();
expect(log, equals([AnimationStatus.forward]));
expect(valueLog, equals([]));
controller.forward();
expect(log, equals([AnimationStatus.forward]));
expect(valueLog, equals([]));
controller.reverse();
log.clear();
Scheduler.instance.handleBeginFrame(const Duration(seconds: 10));
expect(log, equals([]));
expect(valueLog, equals([]));
Scheduler.instance.handleBeginFrame(const Duration(seconds: 20));
expect(log, equals([]));
expect(valueLog, equals([]));
Scheduler.instance.handleBeginFrame(const Duration(seconds: 30));
expect(log, equals([]));
expect(valueLog, equals([]));
Scheduler.instance.handleBeginFrame(const Duration(seconds: 40));
expect(log, equals([]));
expect(valueLog, equals([]));
controller.stop();
}); });
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment