// 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/widgets.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 PageRoute(builder: (_) => new Container(child: new ThePositiveNumbers())); else if (settings.name == '/second') return new PageRoute(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); }); }); }