flutter/packages/unit/test/widget/navigator_test.dart
Ian Hickson 8a900f9042 Track scroll position
- Change RouteArguments to pass the route's BuildContext rather than
  the Navigator. This caused the bulk of the examples/ and .../test/
  changes (those are mostly mechanical changes). It also meant I could
  simplify Navigator.of().

- Make initState() actually get called when the State's Element is in
  the tree, so you can use Foo.of() functions there. Added a test for
  this also.

- Provide a RouteWidget so that routes have a position in the Widget
  tree. The bulk of the route logic is still in a longer-lived Route
  object for now.

- Make Route.setState() only rebuild the actual route, not the whole
  navigator.

- Provided a Route.of().

- Provided a Route.writeState / Route.readState API that tries to
  identify the clients by their runtimeType, their key, and their
  ancestors keys, up to the nearest ancestor with a GlobalKey.

- Made scrollables hook into this API to track state. Added a test to
  make sure this works.

- Fix the debug output of GestureDetector and the hashCode of
  MixedViewport.

- Fixed ScrollableWidgetListState<T> to handle infinite lists.
2015-10-27 13:46:07 -07:00

74 lines
2.1 KiB
Dart

import 'package:flutter/widgets.dart';
import 'package:test/test.dart';
import 'widget_tester.dart';
class FirstComponent extends StatelessComponent {
Widget build(BuildContext context) {
return new GestureDetector(
onTap: () {
Navigator.of(context).pushNamed('/second');
},
child: new Container(
decoration: new BoxDecoration(
backgroundColor: new Color(0xFFFFFF00)
),
child: new Text('X')
)
);
}
}
class SecondComponent extends StatefulComponent {
SecondComponentState createState() => new SecondComponentState();
}
class SecondComponentState extends State<SecondComponent> {
Widget build(BuildContext context) {
return new GestureDetector(
onTap: Navigator.of(context).pop,
child: new Container(
decoration: new BoxDecoration(
backgroundColor: new Color(0xFFFF00FF)
),
child: new Text('Y')
)
);
}
}
void main() {
test('Can navigator navigate to and from a stateful component', () {
testWidgets((WidgetTester tester) {
final Map<String, RouteBuilder> routes = <String, RouteBuilder>{
'/': (RouteArguments args) => new FirstComponent(),
'/second': (RouteArguments args) => new SecondComponent(),
};
tester.pumpWidget(new Navigator(routes: routes));
expect(tester.findText('X'), isNotNull);
expect(tester.findText('Y'), isNull);
tester.tap(tester.findText('X'));
tester.pump(const Duration(milliseconds: 10));
expect(tester.findText('X'), isNotNull);
expect(tester.findText('Y'), isNotNull);
tester.pump(const Duration(milliseconds: 10));
tester.pump(const Duration(milliseconds: 10));
tester.pump(const Duration(seconds: 1));
tester.tap(tester.findText('Y'));
tester.pump(const Duration(milliseconds: 10));
tester.pump(const Duration(milliseconds: 10));
tester.pump(const Duration(milliseconds: 10));
tester.pump(const Duration(seconds: 1));
expect(tester.findText('X'), isNotNull);
expect(tester.findText('Y'), isNull);
});
});
}