@@ -5352,6 +5352,56 @@ void main() {
5352
5352
variant: const TargetPlatformVariant (< TargetPlatform > { TargetPlatform .android }),
5353
5353
skip: isBrowser, // [intended] only non-web Android supports predictive back.
5354
5354
);
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
+ });
5355
5405
});
5356
5406
});
5357
5407
}
@@ -5487,6 +5537,36 @@ class ZeroTransitionPage extends Page<void> {
5487
5537
}
5488
5538
}
5489
5539
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
+
5490
5570
class TestPage extends Page <void > {
5491
5571
const TestPage ({
5492
5572
super .key,
0 commit comments