flutter/packages/unit/test/widget/remember_scroll_position_test.dart
Hixie 309d25d4bb Move Material page animations to Material layer.
PageRoute is now MaterialPageRoute.

This also changes the following:

- Now the HeroController is a Navigator observer, rather than a feature
  of HeroPageRoutes, which are gone. This means heroes can work between
  any kind of ModalRoute now.

- ModalPageRoute is moved from modal_barrier.dart to routes.dart.

- It allows routes to opt-out of their modal barrier being a shortcut to
  popping the route.

- Features of PageRoute that aren't Material-specific get promoted to
  ModalRoute features: storage, the subtree key, offstageness...

The AnimatedModalBarrier is still a ModalRoute feature.
2015-11-16 12:53:12 -08:00

115 lines
4.4 KiB
Dart

// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/animation.dart';
import 'package:flutter/material.dart';
import 'package:test/test.dart';
import 'widget_tester.dart';
class ThePositiveNumbers extends ScrollableWidgetList {
ThePositiveNumbers() : super(itemExtent: 100.0);
ThePositiveNumbersState createState() => new ThePositiveNumbersState();
}
class ThePositiveNumbersState extends ScrollableWidgetListState<ThePositiveNumbers> {
ScrollBehavior createScrollBehavior() => new UnboundedBehavior();
int get itemCount => null;
List<Widget> buildItems(BuildContext context, int start, int count) {
List<Widget> result = new List<Widget>();
for (int index = start; index < start + count; index += 1)
result.add(new Text('$index', key: new ValueKey<int>(index)));
return result;
}
}
void main() {
test('whether we remember our scroll position', () {
testWidgets((WidgetTester tester) {
GlobalKey<NavigatorState> navigatorKey = new GlobalKey<NavigatorState>();
tester.pumpWidget(new Navigator(
key: navigatorKey,
onGenerateRoute: (NamedRouteSettings settings) {
if (settings.name == '/')
return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
else if (settings.name == '/second')
return new MaterialPageRoute(builder: (_) => new Container(child: new ThePositiveNumbers()));
return null;
}
));
// we're 600 pixels high, each item is 100 pixels high, scroll position is
// zero, so we should have exactly 6 items, 0..5.
expect(tester.findText('0'), isNotNull);
expect(tester.findText('1'), isNotNull);
expect(tester.findText('2'), isNotNull);
expect(tester.findText('3'), isNotNull);
expect(tester.findText('4'), isNotNull);
expect(tester.findText('5'), isNotNull);
expect(tester.findText('6'), isNull);
expect(tester.findText('10'), isNull);
expect(tester.findText('100'), isNull);
StatefulComponentElement<ThePositiveNumbers, ThePositiveNumbersState> target =
tester.findElement((Element element) => element.widget is ThePositiveNumbers);
target.state.scrollTo(1000.0);
tester.pump(new Duration(seconds: 1));
// we're 600 pixels high, each item is 100 pixels high, scroll position is
// 1000, so we should have exactly 6 items, 10..15.
expect(tester.findText('0'), isNull);
expect(tester.findText('8'), isNull);
expect(tester.findText('9'), isNull);
expect(tester.findText('10'), isNotNull);
expect(tester.findText('11'), isNotNull);
expect(tester.findText('12'), isNotNull);
expect(tester.findText('13'), isNotNull);
expect(tester.findText('14'), isNotNull);
expect(tester.findText('15'), isNotNull);
expect(tester.findText('16'), isNull);
expect(tester.findText('100'), isNull);
navigatorKey.currentState.pushNamed('/second');
tester.pump(); // navigating always takes two frames
tester.pump(new Duration(seconds: 1));
// same as the first list again
expect(tester.findText('0'), isNotNull);
expect(tester.findText('1'), isNotNull);
expect(tester.findText('2'), isNotNull);
expect(tester.findText('3'), isNotNull);
expect(tester.findText('4'), isNotNull);
expect(tester.findText('5'), isNotNull);
expect(tester.findText('6'), isNull);
expect(tester.findText('10'), isNull);
expect(tester.findText('100'), isNull);
navigatorKey.currentState.pop();
tester.pump(); // navigating always takes two frames
tester.pump(new Duration(seconds: 1));
// we're 600 pixels high, each item is 100 pixels high, scroll position is
// 1000, so we should have exactly 6 items, 10..15.
expect(tester.findText('0'), isNull);
expect(tester.findText('8'), isNull);
expect(tester.findText('9'), isNull);
expect(tester.findText('10'), isNotNull);
expect(tester.findText('11'), isNotNull);
expect(tester.findText('12'), isNotNull);
expect(tester.findText('13'), isNotNull);
expect(tester.findText('14'), isNotNull);
expect(tester.findText('15'), isNotNull);
expect(tester.findText('16'), isNull);
expect(tester.findText('100'), isNull);
});
});
}