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 { ...@@ -151,20 +151,20 @@ class ScrollPosition extends ViewportOffset {
final RenderAbstractViewport viewport = RenderAbstractViewport.of(object); final RenderAbstractViewport viewport = RenderAbstractViewport.of(object);
assert(viewport != null); 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(); return new Future<Null>.value();
if (duration == Duration.ZERO) { if (duration == Duration.ZERO) {
jumpTo(to); jumpTo(target);
return new Future<Null>.value(); 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 /// Any active animation is canceled. If the user is currently scrolling, that
/// action is canceled. /// action is canceled.
...@@ -188,11 +188,10 @@ class ScrollPosition extends ViewportOffset { ...@@ -188,11 +188,10 @@ class ScrollPosition extends ViewportOffset {
/// position would normally bounce back). /// position would normally bounce back).
/// ///
/// The duration must not be zero. To jump to a particular value without an /// 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]. /// The animation is handled by an [DrivenScrollActivity].
Future<Null> animate({ Future<Null> animateTo(double to, {
@required double to,
@required Duration duration, @required Duration duration,
@required Curve curve, @required Curve curve,
}) { }) {
...@@ -514,19 +513,19 @@ abstract class ScrollActivity { ...@@ -514,19 +513,19 @@ abstract class ScrollActivity {
/// [ScrollPosition.beginBallisticActivity]. /// [ScrollPosition.beginBallisticActivity].
void resetActivity() { } void resetActivity() { }
Notification createScrollStartNotification(Scrollable2State scrollable) { Notification createScrollStartNotification(AbstractScrollState scrollable) {
return new ScrollStartNotification(scrollable: 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); 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); return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll);
} }
Notification createScrollEndNotification(Scrollable2State scrollable) { Notification createScrollEndNotification(AbstractScrollState scrollable) {
return new ScrollEndNotification(scrollable: scrollable); return new ScrollEndNotification(scrollable: scrollable);
} }
...@@ -609,25 +608,25 @@ class DragScrollActivity extends ScrollActivity { ...@@ -609,25 +608,25 @@ class DragScrollActivity extends ScrollActivity {
dynamic _lastDetails; dynamic _lastDetails;
@override @override
Notification createScrollStartNotification(Scrollable2State scrollable) { Notification createScrollStartNotification(AbstractScrollState scrollable) {
assert(_lastDetails is DragStartDetails); assert(_lastDetails is DragStartDetails);
return new ScrollStartNotification(scrollable: scrollable, dragDetails: _lastDetails); return new ScrollStartNotification(scrollable: scrollable, dragDetails: _lastDetails);
} }
@override @override
Notification createScrollUpdateNotification(Scrollable2State scrollable, double scrollDelta) { Notification createScrollUpdateNotification(AbstractScrollState scrollable, double scrollDelta) {
assert(_lastDetails is DragUpdateDetails); assert(_lastDetails is DragUpdateDetails);
return new ScrollUpdateNotification(scrollable: scrollable, scrollDelta: scrollDelta, dragDetails: _lastDetails); return new ScrollUpdateNotification(scrollable: scrollable, scrollDelta: scrollDelta, dragDetails: _lastDetails);
} }
@override @override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) { Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
assert(_lastDetails is DragUpdateDetails); assert(_lastDetails is DragUpdateDetails);
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, dragDetails: _lastDetails); return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, dragDetails: _lastDetails);
} }
@override @override
Notification createScrollEndNotification(Scrollable2State scrollable) { Notification createScrollEndNotification(AbstractScrollState scrollable) {
assert(_lastDetails is DragEndDetails); assert(_lastDetails is DragEndDetails);
return new ScrollEndNotification(scrollable: scrollable, dragDetails: _lastDetails); return new ScrollEndNotification(scrollable: scrollable, dragDetails: _lastDetails);
} }
...@@ -689,7 +688,7 @@ class BallisticScrollActivity extends ScrollActivity { ...@@ -689,7 +688,7 @@ class BallisticScrollActivity extends ScrollActivity {
} }
@override @override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) { Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity); return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity);
} }
...@@ -761,7 +760,7 @@ class DrivenScrollActivity extends ScrollActivity { ...@@ -761,7 +760,7 @@ class DrivenScrollActivity extends ScrollActivity {
} }
@override @override
Notification createOverscrollNotification(Scrollable2State scrollable, double overscroll) { Notification createOverscrollNotification(AbstractScrollState scrollable, double overscroll) {
return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity); return new OverscrollNotification(scrollable: scrollable, overscroll: overscroll, velocity: velocity);
} }
......
...@@ -7,6 +7,7 @@ import 'package:meta/meta.dart'; ...@@ -7,6 +7,7 @@ import 'package:meta/meta.dart';
import 'framework.dart'; import 'framework.dart';
import 'basic.dart'; import 'basic.dart';
import 'scroll_controller.dart';
import 'scroll_physics.dart'; import 'scroll_physics.dart';
import 'scroll_position.dart'; import 'scroll_position.dart';
import 'scrollable.dart'; import 'scrollable.dart';
...@@ -18,6 +19,7 @@ abstract class ScrollView extends StatelessWidget { ...@@ -18,6 +19,7 @@ abstract class ScrollView extends StatelessWidget {
Key key, Key key,
this.scrollDirection: Axis.vertical, this.scrollDirection: Axis.vertical,
this.reverse: false, this.reverse: false,
this.controller,
this.physics, this.physics,
this.shrinkWrap: false, this.shrinkWrap: false,
}) : super(key: key) { }) : super(key: key) {
...@@ -29,6 +31,8 @@ abstract class ScrollView extends StatelessWidget { ...@@ -29,6 +31,8 @@ abstract class ScrollView extends StatelessWidget {
final bool reverse; final bool reverse;
final ScrollController controller;
final ScrollPhysics physics; final ScrollPhysics physics;
final bool shrinkWrap; final bool shrinkWrap;
...@@ -54,6 +58,7 @@ abstract class ScrollView extends StatelessWidget { ...@@ -54,6 +58,7 @@ abstract class ScrollView extends StatelessWidget {
AxisDirection axisDirection = getDirection(context); AxisDirection axisDirection = getDirection(context);
return new Scrollable2( return new Scrollable2(
axisDirection: axisDirection, axisDirection: axisDirection,
controller: controller,
physics: physics, physics: physics,
viewportBuilder: (BuildContext context, ViewportOffset offset) { viewportBuilder: (BuildContext context, ViewportOffset offset) {
if (shrinkWrap) { if (shrinkWrap) {
...@@ -87,6 +92,7 @@ class CustomScrollView extends ScrollView { ...@@ -87,6 +92,7 @@ class CustomScrollView extends ScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
this.slivers: const <Widget>[], this.slivers: const <Widget>[],
...@@ -94,6 +100,7 @@ class CustomScrollView extends ScrollView { ...@@ -94,6 +100,7 @@ class CustomScrollView extends ScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
); );
...@@ -109,6 +116,7 @@ abstract class BoxScrollView extends ScrollView { ...@@ -109,6 +116,7 @@ abstract class BoxScrollView extends ScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
this.padding, this.padding,
...@@ -116,6 +124,7 @@ abstract class BoxScrollView extends ScrollView { ...@@ -116,6 +124,7 @@ abstract class BoxScrollView extends ScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
); );
...@@ -154,6 +163,7 @@ class ListView extends BoxScrollView { ...@@ -154,6 +163,7 @@ class ListView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -163,6 +173,7 @@ class ListView extends BoxScrollView { ...@@ -163,6 +173,7 @@ class ListView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -172,6 +183,7 @@ class ListView extends BoxScrollView { ...@@ -172,6 +183,7 @@ class ListView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -182,6 +194,7 @@ class ListView extends BoxScrollView { ...@@ -182,6 +194,7 @@ class ListView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -191,6 +204,7 @@ class ListView extends BoxScrollView { ...@@ -191,6 +204,7 @@ class ListView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -200,6 +214,7 @@ class ListView extends BoxScrollView { ...@@ -200,6 +214,7 @@ class ListView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -243,6 +258,7 @@ class GridView extends BoxScrollView { ...@@ -243,6 +258,7 @@ class GridView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -252,6 +268,7 @@ class GridView extends BoxScrollView { ...@@ -252,6 +268,7 @@ class GridView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -263,6 +280,7 @@ class GridView extends BoxScrollView { ...@@ -263,6 +280,7 @@ class GridView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -272,6 +290,7 @@ class GridView extends BoxScrollView { ...@@ -272,6 +290,7 @@ class GridView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -284,6 +303,7 @@ class GridView extends BoxScrollView { ...@@ -284,6 +303,7 @@ class GridView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -302,6 +322,7 @@ class GridView extends BoxScrollView { ...@@ -302,6 +322,7 @@ class GridView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -311,6 +332,7 @@ class GridView extends BoxScrollView { ...@@ -311,6 +332,7 @@ class GridView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.vertical, Axis scrollDirection: Axis.vertical,
bool reverse: false, bool reverse: false,
ScrollController controller,
ScrollPhysics physics, ScrollPhysics physics,
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
...@@ -329,6 +351,7 @@ class GridView extends BoxScrollView { ...@@ -329,6 +351,7 @@ class GridView extends BoxScrollView {
key: key, key: key,
scrollDirection: scrollDirection, scrollDirection: scrollDirection,
reverse: reverse, reverse: reverse,
controller: controller,
physics: physics, physics: physics,
shrinkWrap: shrinkWrap, shrinkWrap: shrinkWrap,
padding: padding, padding: padding,
...@@ -360,6 +383,7 @@ class PageView extends BoxScrollView { ...@@ -360,6 +383,7 @@ class PageView extends BoxScrollView {
Key key, Key key,
Axis scrollDirection: Axis.horizontal, Axis scrollDirection: Axis.horizontal,
bool reverse: false, bool reverse: false,
// TODO(abarth): Add PageController that knows about pages.
ScrollPhysics physics: const PageScrollPhysics(), ScrollPhysics physics: const PageScrollPhysics(),
bool shrinkWrap: false, bool shrinkWrap: false,
EdgeInsets padding, EdgeInsets padding,
......
...@@ -22,6 +22,7 @@ import 'notification_listener.dart'; ...@@ -22,6 +22,7 @@ import 'notification_listener.dart';
import 'page_storage.dart'; import 'page_storage.dart';
import 'scroll_behavior.dart'; import 'scroll_behavior.dart';
import 'scroll_configuration.dart'; import 'scroll_configuration.dart';
import 'scroll_controller.dart';
import 'scroll_notification.dart'; import 'scroll_notification.dart';
import 'scroll_position.dart'; import 'scroll_position.dart';
import 'ticker_provider.dart'; import 'ticker_provider.dart';
...@@ -35,6 +36,7 @@ class Scrollable2 extends StatefulWidget { ...@@ -35,6 +36,7 @@ class Scrollable2 extends StatefulWidget {
Scrollable2({ Scrollable2({
Key key, Key key,
this.axisDirection: AxisDirection.down, this.axisDirection: AxisDirection.down,
this.controller,
this.physics, this.physics,
@required this.viewportBuilder, @required this.viewportBuilder,
}) : super (key: key) { }) : super (key: key) {
...@@ -44,6 +46,8 @@ class Scrollable2 extends StatefulWidget { ...@@ -44,6 +46,8 @@ class Scrollable2 extends StatefulWidget {
final AxisDirection axisDirection; final AxisDirection axisDirection;
final ScrollController controller;
final ScrollPhysics physics; final ScrollPhysics physics;
final ViewportBuilder viewportBuilder; final ViewportBuilder viewportBuilder;
...@@ -125,14 +129,16 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin ...@@ -125,14 +129,16 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin
if (config.physics != null) if (config.physics != null)
physics = config.physics.applyTo(physics); physics = config.physics.applyTo(physics);
final ScrollPosition oldPosition = position; final ScrollPosition oldPosition = position;
_position = physics.createScrollPosition(physics, this, oldPosition);
assert(position != null);
if (oldPosition != null) { if (oldPosition != null) {
// It's important that we not do this until after the viewport has had a config.controller?.detach(oldPosition);
// chance to unregister its listeners from the old position. So, schedule // It's important that we not dispose the old position until after the
// a microtask to do it. // viewport has had a chance to unregister its listeners from the old
// position. So, schedule a microtask to do it.
scheduleMicrotask(oldPosition.dispose); scheduleMicrotask(oldPosition.dispose);
} }
_position = physics.createScrollPosition(physics, this, oldPosition);
assert(position != null);
config.controller?.attach(position);
} }
@override @override
...@@ -153,12 +159,19 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin ...@@ -153,12 +159,19 @@ class Scrollable2State extends State<Scrollable2> with TickerProviderStateMixin
@override @override
void didUpdateConfig(Scrollable2 oldConfig) { void didUpdateConfig(Scrollable2 oldConfig) {
super.didUpdateConfig(oldConfig); super.didUpdateConfig(oldConfig);
if (config.controller != oldConfig.controller) {
oldConfig.controller?.detach(position);
config.controller?.attach(position);
}
if (_shouldUpdatePosition(oldConfig)) if (_shouldUpdatePosition(oldConfig))
_updatePosition(); _updatePosition();
} }
@override @override
void dispose() { void dispose() {
config.controller?.detach(position);
position.dispose(); position.dispose();
super.dispose(); super.dispose();
} }
......
...@@ -47,6 +47,7 @@ export 'src/widgets/raw_keyboard_listener.dart'; ...@@ -47,6 +47,7 @@ export 'src/widgets/raw_keyboard_listener.dart';
export 'src/widgets/routes.dart'; export 'src/widgets/routes.dart';
export 'src/widgets/scroll_behavior.dart'; export 'src/widgets/scroll_behavior.dart';
export 'src/widgets/scroll_configuration.dart'; export 'src/widgets/scroll_configuration.dart';
export 'src/widgets/scroll_controller.dart';
export 'src/widgets/scroll_notification.dart'; export 'src/widgets/scroll_notification.dart';
export 'src/widgets/scroll_physics.dart'; export 'src/widgets/scroll_physics.dart';
export 'src/widgets/scroll_position.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() { ...@@ -44,7 +44,7 @@ void main() {
expect(position.pixels, 0.0); expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max); expect(position.pixels, max);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
...@@ -71,7 +71,7 @@ void main() { ...@@ -71,7 +71,7 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false); verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), true); verifyPaintPosition(key1, new Offset(0.0, 0.0), true);
verifyPaintPosition(key2, new Offset(0.0, 600.0 - delegate.maxExtent), true); verifyPaintPosition(key2, new Offset(0.0, 600.0 - delegate.maxExtent), true);
...@@ -79,42 +79,42 @@ void main() { ...@@ -79,42 +79,42 @@ void main() {
verifyPaintPosition(key3, new Offset(0.0, 600.0), false); verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
assert(delegate.maxExtent * 2.0 < 600.0); // make sure this fits on the test screen... 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), true); verifyPaintPosition(key1, new Offset(0.0, 0.0), true);
verifyPaintPosition(key2, new Offset(0.0, 600.0 - delegate.maxExtent * 2.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)); 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); 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)); 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); 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)); 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); 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)); 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); 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)); 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false); verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
...@@ -141,13 +141,13 @@ void main() { ...@@ -141,13 +141,13 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false); verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), false); verifyPaintPosition(key2, new Offset(0.0, 0.0), false);
...@@ -174,13 +174,13 @@ void main() { ...@@ -174,13 +174,13 @@ void main() {
verifyPaintPosition(key2, new Offset(0.0, 600.0), false); verifyPaintPosition(key2, new Offset(0.0, 600.0), false);
verifyPaintPosition(key3, 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, 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); 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 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
......
...@@ -47,7 +47,7 @@ void main() { ...@@ -47,7 +47,7 @@ void main() {
expect(position.pixels, 0.0); expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max); expect(position.pixels, max);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
...@@ -80,21 +80,21 @@ void main() { ...@@ -80,21 +80,21 @@ void main() {
verifyPaintPosition(key3, new Offset(0.0, 600.0), false); verifyPaintPosition(key3, new Offset(0.0, 600.0), false);
verifyPaintPosition(key4, 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); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 100));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 200.0), true); verifyPaintPosition(key3, new Offset(0.0, 200.0), true);
verifyPaintPosition(key4, new Offset(0.0, 400.0), true); verifyPaintPosition(key4, new Offset(0.0, 400.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 200));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, new Offset(0.0, 150.0), true); verifyPaintPosition(key3, new Offset(0.0, 150.0), true);
verifyPaintPosition(key4, new Offset(0.0, 350.0), true); verifyPaintPosition(key4, new Offset(0.0, 350.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 300));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
...@@ -102,7 +102,7 @@ void main() { ...@@ -102,7 +102,7 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 200.0)); 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(key4, new Offset(0.0, 300.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 400));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
...@@ -110,7 +110,7 @@ void main() { ...@@ -110,7 +110,7 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 150.0)); 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(key4, new Offset(0.0, 250.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 500));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
...@@ -118,28 +118,28 @@ void main() { ...@@ -118,28 +118,28 @@ void main() {
verifyActualBoxPosition(tester, find.byType(Container), 1, new Rect.fromLTWH(0.0, 100.0, 800.0, 100.0)); 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(key4, new Offset(0.0, 200.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 60));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, 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(key4, new Offset(0.0, 150.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 70));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, 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(key4, new Offset(0.0, 100.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 80));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
verifyPaintPosition(key3, 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(key4, new Offset(0.0, 50.0), true);
verifyPaintPosition(key5, new Offset(0.0, 600.0), false); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 90));
verifyPaintPosition(key1, new Offset(0.0, 0.0), false); verifyPaintPosition(key1, new Offset(0.0, 0.0), false);
verifyPaintPosition(key2, new Offset(0.0, 0.0), true); verifyPaintPosition(key2, new Offset(0.0, 0.0), true);
...@@ -171,7 +171,7 @@ void main() { ...@@ -171,7 +171,7 @@ void main() {
expect(position.pixels, 0.0); expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max); expect(position.pixels, max);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
......
...@@ -38,7 +38,7 @@ void main() { ...@@ -38,7 +38,7 @@ void main() {
expect(position.pixels, 0.0); expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max); expect(position.pixels, max);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
...@@ -65,7 +65,7 @@ void main() { ...@@ -65,7 +65,7 @@ void main() {
), ),
); );
ScrollPosition position = tester.state<Scrollable2State>(find.byType(Scrollable2)).position; 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 1000));
RenderBox box = tester.renderObject<RenderBox>(find.byType(Container)); RenderBox box = tester.renderObject<RenderBox>(find.byType(Container));
Rect rect = new Rect.fromPoints(box.localToGlobal(Point.origin), box.localToGlobal(box.size.bottomRight(Point.origin))); Rect rect = new Rect.fromPoints(box.localToGlobal(Point.origin), box.localToGlobal(box.size.bottomRight(Point.origin)));
......
...@@ -153,31 +153,31 @@ void main() { ...@@ -153,31 +153,31 @@ void main() {
); );
ScrollPosition position = tester.state<Scrollable2State>(find.byType(Scrollable2)).position; 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: 10)); await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50)); await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122)); 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: 10)); await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50)); await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122)); 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: 10)); await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50)); await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122)); 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: 10)); await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50)); await tester.pump(const Duration(milliseconds: 50));
await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 122)); 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: 10)); await tester.pump(const Duration(milliseconds: 10));
await tester.pump(const Duration(milliseconds: 50)); await tester.pump(const Duration(milliseconds: 50));
......
...@@ -40,7 +40,7 @@ void main() { ...@@ -40,7 +40,7 @@ void main() {
expect(position.pixels, 0.0); expect(position.pixels, 0.0);
expect(position.minScrollExtent, 0.0); expect(position.minScrollExtent, 0.0);
expect(position.maxScrollExtent, max); 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)); await tester.pumpUntilNoTransientCallbacks(const Duration(milliseconds: 10));
expect(position.pixels, max); expect(position.pixels, max);
expect(position.minScrollExtent, 0.0); 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