// 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 Positioned 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 Positioned 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 Positioned 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 RelativeRectTween 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 AnimationController controller = AnimationController( duration: const Duration(seconds: 10), vsync: tester, ); final List<Size> sizes = <Size>[]; final List<Offset> positions = <Offset>[]; final GlobalKey key = GlobalKey(); void recordMetrics() { final RenderBox box = key.currentContext!.findRenderObject()! as RenderBox; final BoxParentData 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<void> 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); }); }