blob: d03d96a904737f0dfcf4a45074986f3f8f434aaf [file] [log] [blame] [edit]
// Copyright 2014 The Flutter 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/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Positioned constructors', (WidgetTester tester) async {
final Widget child = Container();
final a = Positioned(left: 101.0, right: 201.0, top: 301.0, bottom: 401.0, child: child);
expect(a.left, 101.0);
expect(a.right, 201.0);
expect(a.top, 301.0);
expect(a.bottom, 401.0);
expect(a.width, null);
expect(a.height, null);
final b = Positioned.fromRect(
rect: const Rect.fromLTRB(102.0, 302.0, 202.0, 502.0),
child: child,
);
expect(b.left, 102.0);
expect(b.right, null);
expect(b.top, 302.0);
expect(b.bottom, null);
expect(b.width, 100.0);
expect(b.height, 200.0);
final c = Positioned.fromRelativeRect(
rect: const RelativeRect.fromLTRB(103.0, 303.0, 203.0, 403.0),
child: child,
);
expect(c.left, 103.0);
expect(c.right, 203.0);
expect(c.top, 303.0);
expect(c.bottom, 403.0);
expect(c.width, null);
expect(c.height, null);
});
testWidgets('Can animate position data', (WidgetTester tester) async {
final rect = RelativeRectTween(
begin: RelativeRect.fromRect(
const Rect.fromLTRB(10.0, 20.0, 20.0, 30.0),
const Rect.fromLTRB(0.0, 10.0, 100.0, 110.0),
),
end: RelativeRect.fromRect(
const Rect.fromLTRB(80.0, 90.0, 90.0, 100.0),
const Rect.fromLTRB(0.0, 10.0, 100.0, 110.0),
),
);
final controller = AnimationController(duration: const Duration(seconds: 10), vsync: tester);
addTearDown(controller.dispose);
final sizes = <Size>[];
final positions = <Offset>[];
final GlobalKey key = GlobalKey();
void recordMetrics() {
final box = key.currentContext!.findRenderObject()! as RenderBox;
final boxParentData = box.parentData! as BoxParentData;
sizes.add(box.size);
positions.add(boxParentData.offset);
}
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: SizedBox(
height: 100.0,
width: 100.0,
child: Stack(
children: <Widget>[
PositionedTransition(
rect: rect.animate(controller),
child: Container(key: key),
),
],
),
),
),
),
); // t=0
recordMetrics();
final completer = Completer<void>();
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(canceled: false);
await tester.pump();
expect(completer.isCompleted, isTrue);
});
}