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
This commit is contained in:
parent
5f9bd7f003
commit
cd6ed39550
@ -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 @@
|
|||||||
// 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() {
|
|||||||
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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user