flutter_flutter/packages/flutter/test/widget/positioned_test.dart
Ian Hickson 9e673853e5 Turn off AnimationControllers when not in use (#5902)
This requires all AnimationController objects to be given a
TickerProvider, a class that can create the Ticker.

It also provides some nice mixins for people who want to have their
State provide a TickerProvider. And a schedulerTickerProvider for those
cases where you just want to see your battery burn.

Also, we now enforce destruction order for elements.
2016-09-26 10:57:10 -07:00

87 lines
2.9 KiB
Dart

// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
void main() {
testWidgets('Can animate position data', (WidgetTester tester) async {
final RelativeRectTween rect = new RelativeRectTween(
begin: new RelativeRect.fromRect(
new Rect.fromLTRB(10.0, 20.0, 20.0, 30.0),
new Rect.fromLTRB(0.0, 10.0, 100.0, 110.0)
),
end: new RelativeRect.fromRect(
new Rect.fromLTRB(80.0, 90.0, 90.0, 100.0),
new Rect.fromLTRB(0.0, 10.0, 100.0, 110.0)
)
);
final AnimationController controller = new AnimationController(
duration: const Duration(seconds: 10),
vsync: tester,
);
final List<Size> sizes = <Size>[];
final List<Offset> positions = <Offset>[];
final GlobalKey key = new GlobalKey();
void recordMetrics() {
RenderBox box = key.currentContext.findRenderObject();
BoxParentData boxParentData = box.parentData;
sizes.add(box.size);
positions.add(boxParentData.offset);
}
await tester.pumpWidget(
new Center(
child: new Container(
height: 100.0,
width: 100.0,
child: new Stack(
children: <Widget>[
new PositionedTransition(
rect: rect.animate(controller),
child: new Container(
key: key
)
)
]
)
)
)
); // t=0
recordMetrics();
Completer<Null> completer = new Completer<Null>();
controller.forward().whenComplete(completer.complete);
expect(completer.isCompleted, isFalse);
await tester.pump(); // t=0 again
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 1)); // t=1
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 1)); // t=2
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 3)); // t=5
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 5)); // t=10
expect(completer.isCompleted, isFalse);
recordMetrics();
expect(sizes, equals(<Size>[const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0)]));
expect(positions, equals(<Offset>[const Offset(10.0, 10.0), const Offset(10.0, 10.0), const Offset(17.0, 17.0), const Offset(24.0, 24.0), const Offset(45.0, 45.0), const Offset(80.0, 80.0)]));
controller.stop();
await tester.pump();
expect(completer.isCompleted, isTrue);
});
}