Commit 7f2dc470 authored by Adam Barth's avatar Adam Barth Committed by GitHub

Add ScrollController (#7910)

If you pass a ScrollController to a Scrollable2, you can use the controller to
read and write the scroll offset without having to find the Scrollable2State
object.
parent 9014280f
// 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/animation.dart';
import 'package:meta/meta.dart';
import 'scroll_position.dart';
class ScrollController {
final List<ScrollPosition> _positions = <ScrollPosition>[];
double get offset {
assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
assert(_positions.length == 1, 'ScrollController attached to multiple scroll views.');
return _positions.single.pixels;
}
/// Animates the position from its current value to the given value.
///
/// Any active animation is canceled. If the user is currently scrolling, that
/// action is canceled.
///
/// The returned [Future] will complete when the animation ends, whether it
/// completed successfully or whether it was interrupted prematurely.
///
/// An animation will be interrupted whenever the user attempts to scroll
/// manually, or whenever another activity is started, or whenever the
/// animation reaches the edge of the viewport and attempts to overscroll. (If
/// the [ScrollPosition] does not overscroll but instead allows scrolling
/// beyond the extents, then going beyond the extents will not interrupt the
/// animation.)
///
/// The animation is indifferent to changes to the viewport or content
/// dimensions.
///
/// Once the animation has completed, the scroll position will attempt to
/// begin a ballistic activity in case its value is not stable (for example,
/// if it is scrolled beyond the extents and in that situation the scroll
/// position would normally bounce back).
///
/// The duration must not be zero. To jump to a particular value without an
/// animation, use [jumpTo].
Future<Null> animateTo(double offset, {
@required Duration duration,
@required Curve curve,
}) {
assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
assert(_positions.length == 1, 'ScrollController attached to multiple scroll views.');
return _positions.single.animateTo(offset, duration: duration, curve: curve);
}
/// Jumps the scroll position from its current value to the given value,
/// without animation, and without checking if the new value is in range.
///
/// Any active animation is canceled. If the user is currently scrolling, that
/// action is canceled.
///
/// If this method changes the scroll position, a sequence of start/update/end
/// scroll notifications will be dispatched. No overscroll notifications can
/// be generated by this method.
///
/// Immediately after the jump, a ballistic activity is started, in case the
/// value was out of range.
void jumpTo(double value) {
assert(_positions.isNotEmpty, 'ScrollController not attached to any scroll views.');
assert(_positions.length == 1, 'ScrollController attached to multiple scroll views.');
_positions.single.jumpTo(value);
}
/// Register the given position with this controller.
///
/// After this function returns, the [animateTo] and [jumpTo] methods on this
/// controller will manipulate the given position.
void attach(ScrollPosition position) {
assert(!_positions.contains(position));
_positions.add(position);
}
/// Unregister the given position with this controller.
///
/// After this function returns, the [animateTo] and [jumpTo] methods on this
/// controller will not manipulate the given position.
void detach(ScrollPosition position) {
assert(_positions.contains(position));
_positions.remove(position);
}
}
......@@ -151,20 +151,20 @@ class ScrollPosition extends ViewportOffset {
final RenderAbstractViewport viewport = RenderAbstractViewport.of(object);
assert(viewport != null);
final double to = viewport.getOffsetToReveal(object, alignment).clamp(minScrollExtent, maxScrollExtent);
final double target = viewport.getOffsetToReveal(object, alignment).clamp(minScrollExtent, maxScrollExtent);
if (to == pixels)
if (target == pixels)
return new Future<Null>.value();
if (duration == Duration.ZERO) {
jumpTo(to);
jumpTo(target);
return new Future<Null>.value();
}
return animate(to: to, duration: duration, curve: curve);
return animateTo(target, duration: duration, curve: curve);
}
/// Animates the position from its current value to the given value `to`.
/// Animates the position from its current value to the given value.
///
/// Any active animation is canceled. If the user is currently scrolling, that
/// action is canceled.
......@@ -188,11 +188,10 @@ class ScrollPosition extends ViewportOffset {
/// position would normally bounce back).
///
/// The duration must not be zero. To jump to a particular value without an
/// animation, use [setPixels].
/// animation, use [jumpTo].
///
/// The animation is handled by an [DrivenScrollActivity].
Future<Null> animate({
@required double to,
Future<Null> animateTo(double to, {
@required Duration duration,
@required Curve curve,
}) {
......@@ -514,19 +513,19 @@ abstract class ScrollActivity {
/// [ScrollPosition.beginBallisticActivity].
void resetActivity() { }
Notification createScrollStartNotification(Scrollable2State scrollable) {
Notification createScrollStartNotification(AbstractScrollState scrollable) {
return new ScrollStartNotification(scrollable: scrollable);
}
Notification createScrollUpdateNotification(Scrollable2State scrollable, double scrollDelta) {
Notification createScrollUpdateNotification(AbstractScrollState scrollable, double scrollDelta) {
return new ScrollUpdateNotification(scrollable: scrollable, scrollDelta: scrollDelta);
}
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) {
Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll);
}
Notification createScrollEndNotification(Scrollable2State scrollable) {
Notification createScrollEndNotification(AbstractScrollState scrollable) {
return new ScrollEndNotification(scrollable: scrollable);
}
......@@ -609,25 +608,25 @@ class DragScrollActivity extends ScrollActivity {
dynamic _lastDetails;
@override
Notification createScrollStartNotification(Scrollable2State scrollable) {
Notification createScrollStartNotification(AbstractScrollState scrollable) {
assert(_lastDetails is DragStartDetails);
return new ScrollStartNotification(scrollable: scrollable, dragDetails: _lastDetails);
}
@override
Notification createScrollUpdateNotification(Scrollable2State scrollable, double scrollDelta) {
Notification createScrollUpdateNotification(AbstractScrollState scrollable, double scrollDelta) {
assert(_lastDetails is DragUpdateDetails);
return new ScrollUpdateNotification(scrollable: scrollable, scrollDelta: scrollDelta, dragDetails: _lastDetails);
}
@override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) {
Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
assert(_lastDetails is DragUpdateDetails);
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, dragDetails: _lastDetails);
}
@override
Notification createScrollEndNotification(Scrollable2State scrollable) {
Notification createScrollEndNotification(AbstractScrollState scrollable) {
assert(_lastDetails is DragEndDetails);
return new ScrollEndNotification(scrollable: scrollable, dragDetails: _lastDetails);
}
......@@ -689,7 +688,7 @@ class BallisticScrollActivity extends ScrollActivity {
}
@override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) {
Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity);
}
......@@ -761,7 +760,7 @@ class DrivenScrollActivity extends ScrollActivity {
}
@override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) {
Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity);
}
......
......@@ -7,6 +7,7 @@ import 'package:meta/meta.dart';
import 'framework.dart';
import 'basic.dart';
import 'scroll_controller.dart';
import 'scroll_physics.dart';
import 'scroll_position.dart';
import 'scrollable.dart';
......@@ -18,6 +19,7 @@ abstract class ScrollView extends StatelessWidget {
Key key,
this.scrollDirection: Axis.vertical,
this.reverse: false,
this.controller,
this.physics,
this.shrinkWrap: false,
}) : super(key: key) {
......@@ -29,6 +31,8 @@ abstract class ScrollView extends StatelessWidget {
final bool reverse;
final ScrollController controller;
final ScrollPhysics physics;
final bool shrinkWrap;
......@@ -54,6 +58,7 @@ abstract class ScrollView extends StatelessWidget {
AxisDirection axisDirection = getDirection(context);
return new Scrollable2(
axisDirection: axisDirection,
controller: controller,
physics: physics,
viewportBuilder: (BuildContext context, ViewportOffset offset) {
if (shrinkWrap) {
......@@ -87,6 +92,7 @@ class CustomScrollView extends ScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
this.slivers: const <Widget>[],
......@@ -94,6 +100,7 @@ class CustomScrollView extends ScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
);
......@@ -109,6 +116,7 @@ abstract class BoxScrollView extends ScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
this.padding,
......@@ -116,6 +124,7 @@ abstract class BoxScrollView extends ScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
);
......@@ -154,6 +163,7 @@ class ListView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -163,6 +173,7 @@ class ListView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -172,6 +183,7 @@ class ListView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -182,6 +194,7 @@ class ListView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -191,6 +204,7 @@ class ListView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -200,6 +214,7 @@ class ListView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -243,6 +258,7 @@ class GridView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -252,6 +268,7 @@ class GridView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -263,6 +280,7 @@ class GridView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -272,6 +290,7 @@ class GridView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -284,6 +303,7 @@ class GridView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -302,6 +322,7 @@ class GridView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -311,6 +332,7 @@ class GridView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.vertical,
bool reverse: false,
ScrollController controller,
ScrollPhysics physics,
bool shrinkWrap: false,
EdgeInsets padding,
......@@ -329,6 +351,7 @@ class GridView extends BoxScrollView {
key: key,
scrollDirection: scrollDirection,
reverse: reverse,
controller: controller,
physics: physics,
shrinkWrap: shrinkWrap,
padding: padding,
......@@ -360,6 +383,7 @@ class PageView extends BoxScrollView {
Key key,
Axis scrollDirection: Axis.horizontal,
bool reverse: false,
// TODO(abarth): Add PageController that knows about pages.
ScrollPhysics physics: const PageScrollPhysics(),
bool shrinkWrap: false,
EdgeInsets padding,
......
......@@ -22,6 +22,7 @@ import 'notification_listener.dart';
import 'page_storage.dart';
import 'scroll_behavior.dart';
import 'scroll_configuration.dart';
import 'scroll_controller.dart';
import 'scroll_notification.dart';
import 'scroll_position.dart';
import 'ticker_provider.dart';
......@@ -35,6 +36,7 @@ class Scrollable2 extends StatefulWidget {
Scrollable2({
Key key,
this.axisDirection: AxisDirection.down,
this.controller,
this.physics,
@required this.viewportBuilder,
}) : super (key: key) {
......@@ -44,6 +46,8 @@ class Scrollable2 extends StatefulWidget {
final AxisDirection axisDirection;
final ScrollController controller;
final ScrollPhysics physics;
final ViewportBuilder viewportBuilder;
......@@ -125,14 +129,16 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin
if (config.physics != null)
physics = config.physics.applyTo(physics);
final ScrollPosition oldPosition = position;
_position = physics.createScrollPosition(physics, this, oldPosition);
assert(position != null);
if (oldPosition != null) {
// It's important that we not do this until after the viewport has had a
// chance to unregister its listeners from the old position. So, schedule
// a microtask to do it.
config.controller?.detach(oldPosition);
// It's important that we not dispose the old position until after the
// viewport has had a chance to unregister its listeners from the old
// position. So, schedule a microtask to do it.
scheduleMicrotask(oldPosition.dispose);
}
_position = physics.createScrollPosition(physics, this, oldPosition);
assert(position != null);
config.controller?.attach(position);
}
@override
......@@ -153,12 +159,19 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin
@override
void didUpdateConfig(Scrollable2 oldConfig) {
super.didUpdateConfig(oldConfig);
if (config.controller != oldConfig.controller) {
oldConfig.controller?.detach(position);
config.controller?.attach(position);
}
if (_shouldUpdatePosition(oldConfig))
_updatePosition();
}
@override
void dispose() {
config.controller?.detach(position);
position.dispose();
super.dispose();
}
......
......@@ -47,6 +47,7 @@ export 'src/widgets/raw_keyboard_listener.dart';
export 'src/widgets/routes.dart';
export 'src/widgets/scroll_behavior.dart';
export 'src/widgets/scroll_configuration.dart';
export 'src/widgets/scroll_controller.dart';
export 'src/widgets/scroll_notification.dart';
export 'src/widgets/scroll_physics.dart';
export 'src/widgets/scroll_position.dart';
......
// Copyright 2017 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 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'states.dart';
void main() {
testWidgets('ScrollController control test', (WidgetTester tester) async {
ScrollController controller = new ScrollController();
await tester.pumpWidget(new ListView(
controller: controller,
children: kStates.map<Widget>((String state) {
return new Container(
height: 200.0,
child: new Text(state),
);
}).toList()
));
double realOffset() {
return tester.state<Scrollable2State>(find.byType(Scrollable2)).position.pixels;
}
expect(controller.offset, equals(0.0));
expect(realOffset(), equals(controller.offset));
controller.jumpTo(653.0);
expect(controller.offset, equals(653.0));
expect(realOffset(), equals(controller.offset));
await tester.pump();
expect(controller.offset, equals(653.0));
expect(realOffset(), equals(controller.offset));
controller.animateTo(326.0, duration: const Duration(milliseconds: 300), curve: Curves.ease);
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 100));
expect(controller.offset, equals(326.0));
expect(realOffset(), equals(controller.offset));
await tester.pumpWidget(new ListView(
key: new Key('second'),
controller: controller,
children: kStates.map<Widget>((String state) {
return new Container(
height: 200.0,
child: new Text(state),
);
}).toList()
));
expect(controller.offset, equals(0.0));
expect(realOffset(), equals(controller.offset));
controller.jumpTo(653.0);
expect(controller.offset, equals(653.0));
expect(realOffset(), equals(controller.offset));
ScrollController controller2 = new ScrollController();
await tester.pumpWidget(new ListView(
key: new Key('second'),
controller: controller2,
children: kStates.map<Widget>((String state) {
return new Container(
height: 200.0,
child: new Text(state),
);
}).toList()
));
expect(() => controller.offset, throws);
expect(controller2.offset, equals(653.0));
expect(realOffset(), equals(controller2.offset));
expect(() => controller.jumpTo(120.0), throws);
expect(() => controller.animateTo(132.0, duration: const Duration(milliseconds: 300), curve: Curves.ease), throws);
await tester.pumpWidget(new ListView(
key: new Key('second'),
controller: controller2,
physics: const BouncingScrollPhysics(),
children: kStates.map<Widget>((String state) {
return new Container(
height: 200.0,
child: new Text(state),
);
}).toList()
));
expect(controller2.offset, equals(653.0));
expect(realOffset(), equals(controller2.offset));
controller2.jumpTo(432.0);
expect(controller2.offset, equals(432.0));
expect(realOffset(), equals(controller2.offset));
await tester.pump();
expect(controller2.offset, equals(432.0));
expect(realOffset(), equals(controller2.offset));
});
}
......@@ -44,7 +44,7 @@ void main() {
expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max);
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max);
expect(position.minScrollExtent, 0.0);
......@@ -71,7 +71,7 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
position.animate(to: bigHeight - 600.0 + delegate.maxExtent, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight - 600.0 + delegate.maxExtent, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), true);
verifyPaintPosition(key2, new Offset(0.0, 600.0 - delegate.maxExtent), true);
......@@ -79,42 +79,42 @@ void main() {
verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
assert(delegate.maxExtent * 2.0 < 600.0); // make sure this fits on the test screen...
position.animate(to: bigHeight - 600.0 + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight - 600.0 + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), true);
verifyPaintPosition(key2, new Offset(0.0, 600.0 - delegate.maxExtent * 2.0), true);
verifyActualBoxPosition(tester, find.byType(Container), 0, new Rect.fromLTWH(0.0, 600.0 - delegate.maxExtent * 2.0, 800.0, delegate.maxExtent));
verifyPaintPosition(key3, new Offset(0.0, 600.0 - delegate.maxExtent), true);
position.animate(to: bigHeight, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyActualBoxPosition(tester, find.byType(Container), 0, new Rect.fromLTWH(0.0, 0.0, 800.0, delegate.maxExtent));
verifyPaintPosition(key3, new Offset(0.0, delegate.maxExtent), true);
position.animate(to: bigHeight + delegate.maxExtent * 0.1, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 0.1, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyActualBoxPosition(tester, find.byType(Container), 0, new Rect.fromLTWH(0.0, 0.0, 800.0, delegate.maxExtent * 0.9));
verifyPaintPosition(key3, new Offset(0.0, delegate.maxExtent * 0.9), true);
position.animate(to: bigHeight + delegate.maxExtent * 0.5, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 0.5, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyActualBoxPosition(tester, find.byType(Container), 0, new Rect.fromLTWH(0.0, 0.0, 800.0, delegate.maxExtent * 0.5));
verifyPaintPosition(key3, new Offset(0.0, delegate.maxExtent * 0.5), true);
position.animate(to: bigHeight + delegate.maxExtent * 0.9, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 0.9, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyActualBoxPosition(tester, find.byType(Container), 0, new Rect.fromLTWH(0.0, -delegate.maxExtent * 0.4, 800.0, delegate.maxExtent * 0.5));
verifyPaintPosition(key3, new Offset(0.0, delegate.maxExtent * 0.1), true);
position.animate(to: bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
......@@ -141,13 +141,13 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
position.animate(to: bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
verifyPaintPosition(key3, new Offset(0.0, 0.0), true);
position.animate(to: bigHeight + delegate.maxExtent * 1.9, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 1.9, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
......@@ -174,13 +174,13 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
position.animate(to: bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 2.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
verifyPaintPosition(key3, new Offset(0.0, 0.0), true);
position.animate(to: bigHeight + delegate.maxExtent * 1.9, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(bigHeight + delegate.maxExtent * 1.9, curve: Curves.linear, duration: const Duration(minutes: 1));
position.updateUserScrollDirection(ScrollDirection.forward); // ignore: INVALID_USE_OF_PROTECTED_MEMBER, since this is using a protected method for testing purposes
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
......
......@@ -47,7 +47,7 @@ void main() {
expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max);
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max);
expect(position.minScrollExtent, 0.0);
......@@ -80,21 +80,21 @@ void main() {
verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
verifyPaintPosition(key4, new Offset(0.0, 600.0), false);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 550.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(550.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 100));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 200.0), true);
verifyPaintPosition(key4, new Offset(0.0, 400.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 600.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(600.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 200));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 150.0), true);
verifyPaintPosition(key4, new Offset(0.0, 350.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 650.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(650.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 300));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
......@@ -102,7 +102,7 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 200.0));
verifyPaintPosition(key4, new Offset(0.0, 300.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 700.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(700.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 400));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
......@@ -110,7 +110,7 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 150.0));
verifyPaintPosition(key4, new Offset(0.0, 250.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 750.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(750.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 500));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
......@@ -118,28 +118,28 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 100.0));
verifyPaintPosition(key4, new Offset(0.0, 200.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 800.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(800.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 60));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 0.0), true);
verifyPaintPosition(key4, new Offset(0.0, 150.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 850.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(850.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 70));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 0.0), true);
verifyPaintPosition(key4, new Offset(0.0, 100.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 900.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(900.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 80));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 0.0), true);
verifyPaintPosition(key4, new Offset(0.0, 50.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false);
position.animate(to: 950.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(950.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 90));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
......@@ -171,7 +171,7 @@ void main() {
expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max);
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max);
expect(position.minScrollExtent, 0.0);
......
......@@ -38,7 +38,7 @@ void main() {
expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max);
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max);
expect(position.minScrollExtent, 0.0);
......@@ -65,7 +65,7 @@ void main() {
),
);
ScrollPosition position = tester.state<Scrollable2State>(find.byType(Scrollable2)).position;
position.animate(to: RenderBigSliver.height + delegate.maxExtent - 5.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(RenderBigSliver.height + delegate.maxExtent - 5.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
RenderBox box = tester.renderObject<RenderBox>(find.byType(Container));
Rect rect = new Rect.fromPoints(box.localToGlobal(Point.origin), box.localToGlobal(box.size.bottomRight(Point.origin)));
......
......@@ -153,31 +153,31 @@ void main() {
);
ScrollPosition position = tester.state<Scrollable2State>(find.byType(Scrollable2)).position;
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122));
position.animate(to: -10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(-10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122));
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122));
position.animate(to: -10000.0, curve: Curves.linear, duration: const Duration(seconds: 1));
position.animateTo(-10000.0, curve: Curves.linear, duration: const Duration(seconds: 1));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122));
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(seconds: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(seconds: 1));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50));
......
......@@ -40,7 +40,7 @@ void main() {
expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max);
position.animate(to: 10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
position.animateTo(10000.0, curve: Curves.linear, duration: const Duration(minutes: 1));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max);
expect(position.minScrollExtent, 0.0);
......
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