Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter: Move to a new screen without providing navigate back to previous screen

I'm implementing an authentication flow in my Flutter app.

After a sign in attempt, the CheckAuth (which checks whether a user is signed in or not and then opens home screen or sign up screen accordingly) is opened with this code:

  void _signIn() async {
    await _auth
        .signInWithEmailAndPassword(
            email: _userEmail.trim(), password: _userPassword.trim())
        .then((task) {
      // go to home screen
      if (task.getIdToken() != null) {
        setState(() {
          Navigator.pushReplacement(
              context,
              new MaterialPageRoute(
                  builder: (BuildContext context) => new CheckAuth()));
        });
      } else {
        print("Authentication failed");
      }
    });
  }

Problem: I can successfully sign in to the app, but if I tap back button after I sign in, it goes back to the sign in screen (while I expect it to exit from the app).

Question: How to move from one screen to another in Flutter without the way back?

Do I need to somehow delete the navigator history? Or don't use navigator at all? I tried Navigator.replace method, but it didn't seem to work.

like image 952
Darkhan Avatar asked Apr 26 '18 07:04

Darkhan


People also ask

How do you beat the past screen in Flutter?

If the user wishes to close the current screen and come back to the previous screen? If that, Navigator. pop(context) should do the work. However, if you are at the entry screen (the first screen of the app and this screen has no parent screen/previous screen), Navigator.

How do I move from one activity to another in Flutter?

To navigate from one screen to another, you must use the Navigator . Here is an example to navigate on another page which class name is AnotherPage as you may see. Show activity on this post. You have to use navigator.


9 Answers

You need to use Navigator.pushReplacement when leaving the auth screen too. Not just when redirecting to login page.

like image 164
Rémi Rousselet Avatar answered Oct 12 '22 10:10

Rémi Rousselet


You can use the pushAndRemoveUntil method:

Push the given route onto the navigator that most tightly encloses the given context, and then remove all the previous routes until the predicate returns true. To remove all the routes below the pushed route, use a [RoutePredicate] that always returns false (e.g. (Route<dynamic> route) => false).

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(builder: (context) => MainPage()),
  (Route<dynamic> route) => false,
);
like image 29
B Faley Avatar answered Oct 12 '22 09:10

B Faley


You need to use

Navigator
    .of(_context)
    .pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));

Where _context is object of BuildContext And page is which page you directed to.

like image 44
Pullat Junaid Avatar answered Oct 12 '22 09:10

Pullat Junaid


We can use routes for the same Like:

routes: {

        LoginScreen.route_name: (_) => LoginScreen(),
        .....
      },  

And use below code whenever you want to push and remove the backstack

Navigator.of(context).pushReplacementNamed(LoginScreen.route_name);

Note: Define static String inside widget LoginScreen

like image 29
Jitesh Mohite Avatar answered Oct 12 '22 09:10

Jitesh Mohite


Here is the solution -

Use pushAndRemoveUntil instead of pushReplacement

Also, can be use maintainState: true

For set root page

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(
      builder: (context) => pageName, maintainState: true),
      (Route<dynamic> route) => false);

For Push Page one page to another

Navigator.push(
context,
MaterialPageRoute(
    builder: (context) => pageName,
    maintainState: false),)

**If you want to refresh always while appearing page then use: **

maintainState: false

like image 32
Somnath Avatar answered Oct 12 '22 11:10

Somnath


I think you probably have already solved this. But you can set "automaticallyLeadingImplied: false" in the AppBar of the Scaffold you are navigating to.

like image 20
theundercoverartist Avatar answered Oct 12 '22 10:10

theundercoverartist


I have resolved this by popping from current page and showing new page:

Navigator.pop(context);
Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => newPage));
like image 29
Shohin Avatar answered Oct 12 '22 09:10

Shohin


Just simply add the below code:

Navigator.of(context).pushNamedAndRemoveUntil('/routeName', (route) => false);
like image 26
Mostafijur Rahman Avatar answered Oct 12 '22 09:10

Mostafijur Rahman


For anyone wondering there is a new argument that needs to be returned false Navigator.of(context).pushNamedAndRemoveUntil('/', (route) => false);

like image 20
PerfectlySilent AuA Avatar answered Oct 12 '22 09:10

PerfectlySilent AuA