Как разрешить кнопку «Назад» для выхода из приложения во флаттере - PullRequest
0 голосов
/ 14 апреля 2020

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

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

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

1 голос
/ 14 апреля 2020

Экран Login находится в стеке Navigator, из-за чего при попытке открыть экран 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 переведет sh ButtomTab в навигатор и покажет все маршруты в стеке.

0 голосов
/ 14 апреля 2020

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

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

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

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

    onWillPop (context) asyn c {SystemChannels.platform.invokeMethod ('SystemNavigator. поп '); вернуть ложь; }

...