Unverified Commit cd6ed395 authored by Simone Stasi's avatar Simone Stasi Committed by GitHub

fix CupertinoTabView's Android back button handling with PopScope (#141604)

This PR fixes CupertinoTabView's handling of Android back button with PopScope and nested navigators by calling `NavigatorState.maybePop` instead of `NavigatorState.pop`, so that the Navigator pops only when it should.

Fix #139050
parent 5f9bd7f0
...@@ -197,7 +197,7 @@ class _CupertinoTabViewState extends State<CupertinoTabView> { ...@@ -197,7 +197,7 @@ class _CupertinoTabViewState extends State<CupertinoTabView> {
if (!_isActive) { if (!_isActive) {
return; return;
} }
_navigatorKey.currentState!.pop(); _navigatorKey.currentState!.maybePop();
}, },
child: child, child: child,
); );
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
void main() { void main() {
...@@ -289,4 +290,37 @@ void main() { ...@@ -289,4 +290,37 @@ void main() {
expect(find.text('home'), findsOneWidget); expect(find.text('home'), findsOneWidget);
expect(find.text('second route'), findsNothing); expect(find.text('second route'), findsNothing);
}); });
testWidgets('Handles Android back button', (WidgetTester tester) async {
final GlobalKey<NavigatorState> key = GlobalKey<NavigatorState>();
await tester.pumpWidget(
CupertinoApp(
home: CupertinoTabScaffold(
tabBar: CupertinoTabBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(label: '', icon: Text('1')),
BottomNavigationBarItem(label: '', icon: Text('2'))
],
),
tabBuilder: (_, int i) => PopScope(
canPop: false,
child: CupertinoTabView(
navigatorKey: key,
builder: (BuildContext context) => const Text('first route'),
),
),
),
),
);
expect(find.text('first route'), findsOneWidget);
// Simulate android back button intent.
final ByteData message = const JSONMethodCodec().encodeMethodCall(const MethodCall('popRoute'));
await tester.binding.defaultBinaryMessenger.handlePlatformMessage('flutter/navigation', message, (_) {});
await tester.pumpAndSettle();
// Navigator didn't pop, so first route is still visible
expect(find.text('first route'), findsOneWidget);
});
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment