android-studioflutterdart

How to fix WillPopScope() not working for me


I created two pages one is login and main page but i want close app from main page i am using Willpopscope but it is not working for me i have tried all things but the onwillpop method is not calling please help me thank you.

class main_page extends StatelessWidget {
@override
Widget build(BuildContext context) {
  return MaterialApp(
  theme: ThemeData(primarySwatch: Colors.amber),
  home: my_page(),
);
}
}

class my_page extends StatefulWidget {
@override
_my_pageState createState() => _my_pageState();
}

class _my_pageState extends State<my_page> {
 @override
void initState() {
check_login();
 super.initState();
}

Future check_login() async {
SharedPreferences preferences = await SharedPreferences.getInstance();
if (preferences.getBool("islogin") == false)
  setState(() {
    Navigator.of(context).push(MaterialPageRoute(
      builder: (context) => MyApp(),
    ));
  });
}

@override
 Widget build(BuildContext context) {
return WillPopScope(
  onWillPop: () async=>false,
  child: Scaffold(
    appBar: new AppBar(
      title: Text(
        "Home",
        style: new TextStyle(color: Colors.white),
      ),
      actions: <Widget>[
        FlatButton(
            onPressed: () async {
              SharedPreferences sharedPreferences =
                  await SharedPreferences.getInstance();

              setState(() {
                sharedPreferences.setBool("islogin", false);
                Navigator.of(context).push(MaterialPageRoute(
                  builder: (context) => main_page(),
                ));
              });
            },
            child: Text(
              "Logout",
              style: TextStyle(color: Colors.white, fontSize: 16.0),
            ))
      ],
    ),
  ),
);
}
}

I am also using Shredprefrences but i think it does not matter i want close app from my main_page please help me for this Thank you.


Solution

  • Just check out this answer and let me know if it works:

    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    import 'package:flutter/services.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          theme: ThemeData(primarySwatch: Colors.amber),
          home: SecondPage(),
        );
      }
    }
    
    class LoginPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Container(
            child: Center(
                child: RaisedButton(
              child: Text('Move to second page after Login'),
              onPressed: () async {
                SharedPreferences preferences =
                    await SharedPreferences.getInstance();
    
                preferences.setBool("islogin", true);
                // this will remove the login page after routing to the second page and then the stack will have only one page that is second page.
               // so later you can use the willpopscape 
                Navigator.pushAndRemoveUntil(
                    context,
                    MaterialPageRoute(builder: (context) => SecondPage()),
                    ModalRoute.withName("/Home"));
              },
            )),
          ),
        );
      }
    }
    
    class SecondPage extends StatefulWidget {
      @override
      _SecondPageState createState() => _SecondPageState();
    }
    
    class _SecondPageState extends State<SecondPage> {
      @override
      void initState() {
        check_login();
        
        super.initState();
      }
    
      Future check_login() async {
        SharedPreferences preferences = await SharedPreferences.getInstance();
        if (preferences.getBool("islogin") == null)
    
        //This above if statement will check if the parameter islogin is null then redirect to the login screeen
        // else if the value is not null then i will not enter the if statement
          setState(() {
            Navigator.of(context).push(MaterialPageRoute(
              builder: (context) => LoginPage(),
            ));
          });
      }
    
      Future<bool> _onWillPop() async {
    
        // This dialog will exit your app on saying yes
        return (await showDialog(
              context: context,
              builder: (context) => new AlertDialog(
                title: new Text('Are you sure?'),
                content: new Text('Do you want to exit an App'),
                actions: <Widget>[
                  new FlatButton(
                    onPressed: () => Navigator.of(context).pop(false),
                    child: new Text('No'),
                  ),
                  new FlatButton(
                    onPressed: () => Navigator.of(context).pop(true),
                    child: new Text('Yes'),
                  ),
                ],
              ),
            )) ??
            false;
      }
    
      @override
      Widget build(BuildContext context) {
        return WillPopScope(
          onWillPop: _onWillPop,
          child: Scaffold(
            appBar: new AppBar(
              title: Text(
                "Home",
                style: new TextStyle(color: Colors.white),
              ),
              actions: <Widget>[
                FlatButton(
                    onPressed: () async {
                       SystemNavigator.pop();
                    },
                    child: Text(
                      "Logout",
                      style: TextStyle(color: Colors.white, fontSize: 16.0),
                    ))
              ],
            ),
          ),
        );
      }
    }