Adam Barth 8219ab61ab Don't rebuild routes on the second animation frame (#5097)
Previously we would rebuild every route on the second animation frame to
rejigger the offstage bit and the animations. Now we build the page once and
update the offstage bit in place and update the animations using
ProxyAnimations.
2016-07-27 13:49:30 -07:00

121 lines
3.2 KiB
Dart

// Copyright 2016 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/material.dart';
class StateMarker extends StatefulWidget {
StateMarker({ Key key, this.child }) : super(key: key);
final Widget child;
@override
StateMarkerState createState() => new StateMarkerState();
}
class StateMarkerState extends State<StateMarker> {
String marker;
@override
Widget build(BuildContext context) {
if (config.child != null)
return config.child;
return new Container();
}
}
void main() {
testWidgets('Can nest apps', (WidgetTester tester) async {
await tester.pumpWidget(
new MaterialApp(
home: new MaterialApp(
home: new Text('Home sweet home')
)
)
);
expect(find.text('Home sweet home'), findsOneWidget);
});
testWidgets('Focus handling', (WidgetTester tester) async {
GlobalKey inputKey = new GlobalKey();
await tester.pumpWidget(new MaterialApp(
home: new Material(
child: new Center(
child: new Input(key: inputKey, autofocus: true)
)
)
));
expect(Focus.at(inputKey.currentContext), isTrue);
});
testWidgets('Can show grid without losing sync', (WidgetTester tester) async {
await tester.pumpWidget(
new MaterialApp(
home: new StateMarker()
)
);
StateMarkerState state1 = tester.state(find.byType(StateMarker));
state1.marker = 'original';
await tester.pumpWidget(
new MaterialApp(
debugShowMaterialGrid: true,
home: new StateMarker()
)
);
StateMarkerState state2 = tester.state(find.byType(StateMarker));
expect(state1, equals(state2));
expect(state2.marker, equals('original'));
});
testWidgets('Do not rebuild page on the second frame of the route transition', (WidgetTester tester) async {
int buildCounter = 0;
await tester.pumpWidget(
new MaterialApp(
home: new Builder(
builder: (BuildContext context) {
return new Material(
child: new RaisedButton(
child: new Text('X'),
onPressed: () { Navigator.of(context).pushNamed('/next'); }
)
);
}
),
routes: <String, WidgetBuilder>{
'/next': (BuildContext context) {
return new Builder(
builder: (BuildContext context) {
++buildCounter;
return new Container();
}
);
}
}
)
);
expect(buildCounter, 0);
await tester.tap(find.text('X'));
expect(buildCounter, 0);
await tester.pump();
expect(buildCounter, 1);
await tester.pump(const Duration(milliseconds: 10));
expect(buildCounter, 1);
await tester.pump(const Duration(milliseconds: 10));
expect(buildCounter, 1);
await tester.pump(const Duration(milliseconds: 10));
expect(buildCounter, 1);
await tester.pump(const Duration(milliseconds: 10));
expect(buildCounter, 1);
await tester.pump(const Duration(seconds: 1));
expect(buildCounter, 2);
});
}