Guard against a null navigator on popping a route. (#49329)
This commit is contained in:
parent
3f97315720
commit
57e81894b2
@ -136,7 +136,7 @@ abstract class Route<T> {
|
||||
@mustCallSuper
|
||||
TickerFuture didPush() {
|
||||
return TickerFuture.complete()..then<void>((void _) {
|
||||
navigator.focusScopeNode.requestFocus();
|
||||
navigator?.focusScopeNode?.requestFocus();
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1036,6 +1036,54 @@ void main() {
|
||||
expect(find.byKey(keyAB), findsNothing);
|
||||
});
|
||||
|
||||
testWidgets("Popping immediately after pushing doesn't crash", (WidgetTester tester) async {
|
||||
// Added this test to protect against regression of https://github.com/flutter/flutter/issues/45539
|
||||
final Map<String, WidgetBuilder> routes = <String, WidgetBuilder>{
|
||||
'/' : (BuildContext context) => OnTapPage(id: '/', onTap: () {
|
||||
Navigator.pushNamed(context, '/A');
|
||||
Navigator.of(context).pop();
|
||||
}),
|
||||
'/A': (BuildContext context) => OnTapPage(id: 'A', onTap: () { Navigator.pop(context); }),
|
||||
};
|
||||
bool isPushed = false;
|
||||
bool isPopped = false;
|
||||
final TestObserver observer = TestObserver()
|
||||
..onPushed = (Route<dynamic> route, Route<dynamic> previousRoute) {
|
||||
// Pushes the initial route.
|
||||
expect(route is PageRoute && route.settings.name == '/', isTrue);
|
||||
expect(previousRoute, isNull);
|
||||
isPushed = true;
|
||||
}
|
||||
..onPopped = (Route<dynamic> route, Route<dynamic> previousRoute) {
|
||||
isPopped = true;
|
||||
};
|
||||
|
||||
await tester.pumpWidget(MaterialApp(
|
||||
routes: routes,
|
||||
navigatorObservers: <NavigatorObserver>[observer],
|
||||
));
|
||||
expect(find.text('/'), findsOneWidget);
|
||||
expect(find.text('A'), findsNothing);
|
||||
expect(isPushed, isTrue);
|
||||
expect(isPopped, isFalse);
|
||||
|
||||
isPushed = false;
|
||||
isPopped = false;
|
||||
observer.onPushed = (Route<dynamic> route, Route<dynamic> previousRoute) {
|
||||
expect(route is PageRoute && route.settings.name == '/A', isTrue);
|
||||
expect(previousRoute is PageRoute && previousRoute.settings.name == '/', isTrue);
|
||||
isPushed = true;
|
||||
};
|
||||
|
||||
await tester.tap(find.text('/'));
|
||||
await tester.pump();
|
||||
await tester.pump(const Duration(seconds: 1));
|
||||
expect(find.text('/'), findsOneWidget);
|
||||
expect(find.text('A'), findsNothing);
|
||||
expect(isPushed, isTrue);
|
||||
expect(isPopped, isTrue);
|
||||
});
|
||||
|
||||
group('error control test', () {
|
||||
testWidgets('onUnknownRoute null and onGenerateRoute returns null', (WidgetTester tester) async {
|
||||
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user