Как разрешить кнопке возврата выходить из приложения во флаттере

В настоящее время я использую 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),
      ),
    );
  }
}

person uyhaW    schedule 14.04.2020    source источник


Ответы (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 поместит ButtomTab в навигатор и вытолкнет все маршруты в стеке на данный момент.

person Hashir Baig    schedule 14.04.2020

Когда вы переходите на главный экран из окна входа, используйте Navigator.of(context).pushReplacement(newRoute) вместо Navigator.of(context).push(newRoute). Он заменит маршрут входа на домашний маршрут в стеке навигатора, поэтому, когда вы нажмете кнопку «Назад», в стеке навигатора под начальным экраном появится запись, поэтому приложение закроется.

person Zakir    schedule 14.04.2020

Здравствуйте, вы можете выйти из приложения, выполнив следующие действия:

  1. Вставить виджет WillPopScope

    WillPopScope (onWillPop: () => onWillPop (context), child: // Здесь другие виджеты)

  2. затем создайте метод для обработки onWillPop

    onWillPop (контекст) async {SystemChannels.platform.invokeMethod ('SystemNavigator.pop'); вернуть ложь; }

person Constantin N.    schedule 14.04.2020