【问题标题】:How to permit back button to exit app in flutter如何允许后退按钮在颤动中退出应用程序
【发布时间】:2020-07-26 21:17:34
【问题描述】:

我目前正在使用 WillPopScope 来防止后退按钮,我在 youtube 上观看教程并在堆栈溢出中阅读了一些答案,路线是这样的。我有登录屏幕和主屏幕。当我在主屏幕时,当我从手机单击后退按钮 我想关闭我的应用程序,我尝试使用 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),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter exit back


    【解决方案1】:

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

    1. 插入WillPopScope小部件

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

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

      onWillPop(context) 异步 { SystemChannels.platform.invokeMethod('SystemNavigator.pop'); 返回假; }

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        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 会将 ButtonTab 推送到导航器并弹出堆栈中的所有路由。

        【讨论】: