Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter - Navigate to a new screen, and clear all the previous screens

I used Navigator.push up to 6 screens to get to the payment page. After Payment, I want to push to the "Payment Successful" page then remove all the previous screens i.e using the back button will return to the very first screen.

NOTE: I have tried pushReplacementNamed and it doesn't work.

like image 317
Kingsley CA Avatar asked Oct 07 '18 13:10

Kingsley CA


People also ask

What allows navigating between screens of Flutter app?

Navigation in Flutter is done by Navigator class. Because the history is arranged in a stack structure, so moving to another screen means to launch a new instance of that full-screen widget. We will use push() for that.


4 Answers

I figured it out. It was the Navigator.pushAndRemoveUntil function. Where i had to pass the PaymentSuccessful widget as the newRoute, and the "/Home" route as the predicate

  _navPaymentSuccessful(){
    Navigator.pushAndRemoveUntil(
      context, 
      MaterialPageRoute(
        builder: (context) => PaymentSuccessful()
      ), 
     ModalRoute.withName("/Home")
    );
  }
like image 196
Kingsley CA Avatar answered Oct 02 '22 23:10

Kingsley CA


Accepted Answer is correct. But you can try this too.

Navigator.pushAndRemoveUntil<dynamic>(
        context,
        MaterialPageRoute<dynamic>(
          builder: (BuildContext context) => YourPageNameGoesHere(),
        ),
        (route) => false,//if you want to disable back feature set to false
);
like image 39
gsm Avatar answered Oct 02 '22 23:10

gsm


even simpler and I think a better way would be to do it this way, this Schedules a callback for the end of the current persistent frame,to push to route /loginPage and removes all the previous routes,this way you can make sure that all the frames are rendered and then you navigate to next page.

 SchedulerBinding.instance.addPostFrameCallback((_) {
                Navigator.of(context).pushNamedAndRemoveUntil(
                    '/loginPage', (Route<dynamic> route) => false);
              });
like image 33
Mahesh Jamdade Avatar answered Oct 02 '22 22:10

Mahesh Jamdade


I would Suggest use WillPopScope in your Payment successful page and onWillPop method write following snippet of code:

 return WillPopScope(
      onWillPop: (){
        Navigator.of(context)
            .pushNamedAndRemoveUntil('/Home', (Route<dynamic> route) => false);
      },
      child: Scaffold()
};
like image 32
dartKnightRises Avatar answered Oct 02 '22 22:10

dartKnightRises