флаттер: как обрабатывать нажатие кнопки возврата при использовании навигатора со страницами

Я пытаюсь реализовать метод Navigator 2.0. Единственное, чего я не могу заставить работать, так это нажатия кнопки возврата. Когда я нажимаю кнопку «Назад», приложение просто закрывается и не переходит на предыдущую страницу. Я попробовал виджет WillPopPage, но кнопка «Назад» обошла его.

вот пример кода, который не работает при обратном нажатии.

import 'package:flutter/material.dart';

main(List<String> args) {
  runApp(TestApp());
}

class TestApp extends StatefulWidget {
  @override
  _TestAppState createState() => _TestAppState();
}

class _TestAppState extends State<TestApp> {
  bool go = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Navigator(
        pages: [
          // page 1
          MaterialPage(
            child: W1(onTapped: () {
              setState(() => go = true);
            }),
          ),
          // page 2
          if (go) MaterialPage(child: W2()),
        ],
        onPopPage: (route, result) {
          if (!route.didPop(result)) return false;
          go = false;
          return true;
        },
      ),
    );
  }
}

class W1 extends StatelessWidget {
  final void Function() onTapped;

  const W1({Key key, this.onTapped}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: onTapped,
          child: Text("Go to second"),
        ),
      ),
    );
  }
}

class W2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("pressing the back button is exiting the app.."),
      ),
    );
  }
}

Я уже написал много кода с этим подходом, поэтому я больше не могу вернуться к императивной навигации. Как выполнять жим со спины при таком подходе?


person Midhunraj R Pillai    schedule 31.10.2020    source источник


Ответы (2)


Это невозможно с Navigator 2.0 без расширения RouterDelegate. Нажатие системной кнопки «Назад» обрабатывается методом RouteDelegate popRoute. Согласно документам:

Метод должен возвращать логическое значение Future, чтобы указать, обрабатывает ли этот делегат запрос. Возврат false вызовет всплывающее окно всего приложения.

Реализация по умолчанию всегда возвращает false. Следовательно, вы должны переопределить его, чтобы обрабатывать нажатия системных кнопок возврата.

ОБНОВЛЕНИЕ
Я опубликовал статью, в которой представлено быстрое и понятное руководство по использованию Navigator 2.0. Вы можете найти его здесь < / а>.

person Lee3    schedule 05.04.2021
comment
Не могли бы вы привести пример расширения RouterDelegate? - person Houcine; 20.05.2021
comment
Это слишком большая тема, чтобы приводить ее здесь в качестве быстрого примера. Однако я работаю над статьей, которая объяснит, как работать с RouterDelegate и Pages. Я должен опубликовать его в пятницу или субботу. Я обновлю свой ответ ссылкой. - person Lee3; 21.05.2021
comment
@Houcine Пожалуйста, проверьте ссылку в моем обновленном ответе. Я верю, что вы найдете это очень полезным. - person Lee3; 25.05.2021
comment
Хорошо, я проверю - person Houcine; 25.05.2021

Вам нужно будет использовать "WillPopScope" https://api.flutter.dev/flutter/widgets/WillPopScope-class.html

Пример

Future<bool> _willPopScopeCall() async {
// code to show toast or modal
return true; // return true to exit app or return false to cancel exit
}

//wrap your scaffold with WillPopScope
WillPopScope(child: new Scaffold(), onWillPop: _willPopScopeCall);
person bluenile    schedule 31.10.2020
comment
да, я знал, что WillPopScope - это то, что нужно ... Но где именно он пойдет в моей конкретной проблеме? поверх W1 или W2 он не работает (как я уже упоминал). В верхней части навигатора это возможно, но как в этом случае мне вывести страницы из навигатора (который будет ниже WillPopScope)? Вот в чем проблема. - person Midhunraj R Pillai; 31.10.2020
comment
Я разберусь в этом дальше - person Midhunraj R Pillai; 31.10.2020
comment
вы нашли правильный подход? - person Andrey; 31.03.2021
comment
@ Андрей, пожалуйста, посмотри мой ответ - person Lee3; 05.04.2021