@@ -5352,6 +5352,56 @@ void main() {
53525352 variant: const TargetPlatformVariant (< TargetPlatform > { TargetPlatform .android }),
53535353 skip: isBrowser, // [intended] only non-web Android supports predictive back.
53545354 );
5355+
5356+ testWidgets ('canPop and onPopInvoked' , (WidgetTester tester) async {
5357+ bool page2CanPop = false ;
5358+ bool page3CanPop = false ;
5359+ final CanPopPage <int > page1 = CanPopPage <int >(name: 'page1' , pageCanPop: () => false );
5360+ final CanPopPage <String > page2 = CanPopPage <String >(name: 'page2' , pageCanPop: () => page2CanPop);
5361+ final CanPopPage <bool > page3 = CanPopPage <bool >(name: 'page3' , pageCanPop: () => page3CanPop);
5362+ final List <Page <Object ?>> pages = < Page <Object ?>> [page1, page2, page3];
5363+ final GlobalKey <NavigatorState > key = GlobalKey <NavigatorState >();
5364+ await tester.pumpWidget (
5365+ MaterialApp (
5366+ home: Navigator (
5367+ key: key,
5368+ pages: pages,
5369+ onDidRemovePage: (Page <Object ?> page) => pages.remove (page),
5370+ ),
5371+ ),
5372+ );
5373+
5374+ expect (find.text ('page3' ), findsOneWidget);
5375+
5376+ key.currentState! .maybePop (true );
5377+ await tester.pumpAndSettle ();
5378+ expect (find.text ('page3' ), findsOneWidget);
5379+ expect (page3.popInvoked, < CanPopPageInvoke > [(false , true )]);
5380+
5381+ page3CanPop = true ;
5382+ key.currentState! .maybePop (false );
5383+ await tester.pumpAndSettle ();
5384+ expect (find.text ('page3' ), findsNothing);
5385+ expect (find.text ('page2' ), findsOneWidget);
5386+ expect (page3.popInvoked, < CanPopPageInvoke > [(false , true ), (true , false )]);
5387+
5388+ key.currentState! .maybePop ('some string' );
5389+ await tester.pumpAndSettle ();
5390+ expect (find.text ('page2' ), findsOneWidget);
5391+ expect (page2.popInvoked, < CanPopPageInvoke > [(false , 'some string' )]);
5392+
5393+ page2CanPop = true ;
5394+ key.currentState! .maybePop ('another string' );
5395+ await tester.pumpAndSettle ();
5396+ expect (find.text ('page2' ), findsNothing);
5397+ expect (find.text ('page1' ), findsOneWidget);
5398+ expect (page2.popInvoked, < CanPopPageInvoke > [(false , 'some string' ), (true , 'another string' )]);
5399+
5400+ key.currentState! .maybePop (1 );
5401+ await tester.pumpAndSettle ();
5402+ expect (find.text ('page1' ), findsOneWidget);
5403+ expect (page1.popInvoked, < CanPopPageInvoke > [(false , 1 )]);
5404+ });
53555405 });
53565406 });
53575407}
@@ -5487,6 +5537,36 @@ class ZeroTransitionPage extends Page<void> {
54875537 }
54885538}
54895539
5540+ typedef CanPopPageInvoke = (bool didPop, Object ? result);
5541+
5542+ class CanPopPage <T > extends Page <T > {
5543+ CanPopPage ({
5544+ super .key,
5545+ super .name,
5546+ required this .pageCanPop,
5547+ super .arguments,
5548+ });
5549+
5550+ final List <CanPopPageInvoke > popInvoked = < CanPopPageInvoke > [];
5551+
5552+ @override
5553+ bool get canPop => pageCanPop ();
5554+ final ValueGetter <bool > pageCanPop;
5555+
5556+ @override
5557+ PopInvokedWithResultCallback <T > get onPopInvoked => (bool didPop, T ? result) {
5558+ popInvoked.add ((didPop, result));
5559+ };
5560+
5561+ @override
5562+ Route <T > createRoute (BuildContext context) {
5563+ return MaterialPageRoute <T >(
5564+ builder: (BuildContext context) => Text (name! ),
5565+ settings: this ,
5566+ );
5567+ }
5568+ }
5569+
54905570class TestPage extends Page <void > {
54915571 const TestPage ({
54925572 super .key,
0 commit comments