mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
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.
121 lines
3.2 KiB
Dart
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);
|
|
});
|
|
|
|
}
|