如何允许后退按钮在颤振中退出应用程序

How to permit back button to exit app in flutter

我在 youtube 上观看教程并在堆栈溢出中阅读了一些答案后,目前正在使用 WillPopScope 来防止后退按钮,路线是这样的。我有登录屏幕和主屏幕。当我在主屏幕时,当我从 phone 单击后退按钮时我想关闭我的应用程序,我尝试使用 WillPopScope 但是当我单击后退按钮时,它总是将我导航到我的登录屏幕,有没有办法让我的应用程序将单击后退按钮时退出?这是我的代码 这是登录屏幕

class _LoginScreenState extends State<LoginScreen> {
postData() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setInt('username', _username.text);
  Navigator.push(context,
              new MaterialPageRoute(
                  builder: (BuildContext context) =>
                      new BottomTab()));
}
@override
  Widget build(BuildContext context) {
    return Column(
             children:<Widget>[
               TextFormField(
                 controller: _username),
               FlatButton(
                 child: Text("Login"),
                 onPressed: () {
                    postData(_username.text);}),];}
}

这是我的标签

class _BottomTab extends State<BottomTab> {
Future<bool> _back() {
    return showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            content: Text('exit?'),
            actions: <Widget>[
              FlatButton(
                child: Text('ok'),
                onPressed: () {
                  Navigator.of(context).pop(true);
                },
              ),
FlatButton(
                child: Text('no'),
                onPressed: () {
                  Navigator.of(context).pop(false);
                },
              ),
            ],
          );
        });
  }
  int _selectedIndex = 0;

  _onTap(int index) {
    setState(() => _myindex = index);
  }

  final List<Widget> pages = [
    HomeScreen(),
    ProfileScreen(), 
  ];

  final PageStorageBucket bucket = PageStorageBucket();

  Widget _myNavigation(int selectedIndex) => BottomNavigationBar(
        onTap: _onTap,
        currentIndex: myindex,
        type: BottomNavigationBarType.fixed,
        items: const <MyTab>[
          MyTab(icon: Icon(Icons.home), title: Text('Home')),
          MyTab(icon: Icon(Icons.person), title: Text('Profile')),
        ],
      );

  @override
  Widget build(BuildContext context) {
    return FutureProvider<String>(
      create: (context) async {
        final prefs = await SharedPreferences.getInstance();
        return prefs.getString("username");
      },
      child: Scaffold(
        key: scaffoldKey,
        body: WillPopScope(
          onWillPop: back,
          child: PageStorage(
            child: pages[_selectedIndex],
            bucket: bucket,
          ),
        ),
        bottomNavigationBar: _bottomNavigationBar(_selectedIndex),
      ),
    );
  }
}

Login 屏幕位于导航器堆栈中,因此当您尝试从 BottomTab 屏幕弹出时,登录屏幕再次出现。而不是:

Navigator.push(context,
              new MaterialPageRoute(
                  builder: (BuildContext context) =>
                      new BottomTab()));

做这样的事情:

Navigator.pushAndRemoveUntil(
      context,
      MaterialPageRoute(builder: (BuildContext context) => new BottomTab()),
      (Route<dynamic> route) => false
);

Navigator.pushAndRemoveUntil 会将 ButtomTab 推入导航器并弹出堆栈中的所有路由。

当您从登录屏幕转到主屏幕时,请使用 Navigator.of(context).pushReplacement(newRoute) 而不是 Navigator.of(context).push(newRoute)。它将在导航器堆栈中用主页路由替换登录路由,因此当您按下后退按钮时,主屏幕下方的导航器堆栈中会出现注释,因此应用程序将关闭。

您好,您可以通过以下方式退出您的应用程序:

  1. 插入 WillPopScope 小部件

    WillPopScope( onWillPop: () => onWillPop(上下文), child: //其他小部件在这里)

  2. 然后创建一个方法来处理onWillPop

    onWillPop(上下文)异步{ SystemChannels.platform.invokeMethod('SystemNavigator.pop'); return假; }