WillPopScope не работает

Столкнулся тут на одном проекте с тем, что озвученный на большинстве ресурсов WillPopScope в Flutter не отрабатывает. Вообще не заходит в onWillPop. И в точку останова ставил и print — никакой реакции. Выходит из приложения по кнопке «назад» в андроиде и все тут.

Пробовал ставить WillPopScope выше MaterialApp, ниже. Вставлял в явном виде виджет Navigator…

В общем, методом проб и экспериментов выяснилось, что так как в данном проекте применяется Navigator 2, который с делегатом, то WillPopScope не участвует в процессе.

В первую очередь, нужно смотреть в своем навигаторе на функции типа didPop, canPop и т.п, а так же переопределенной didPopRoute в «AppBackBtnDispatcher extends RootBackButtonDispatcher» (перехватчике этой самой кнопки). Но, тут есть нюанс с context, которого как бы в функции по умолчанию нет.

Если же мы хотим вывести диалоговое окно с вопросом «Вы точно собираетесь выйти из приложения,». Тогда нам на помощь приходит функция didPopRoute в самом виджете. Но есть один нюанс.

Виджет должен быть стейтфулом и мы миксуем его стейт с обсервером типа » with WidgetsBindingObserver». В initState при этом запускаем этот обсервер вот так «WidgetsBinding.instance.addObserver(this);», а в dispose убираем

  @override

  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

 Ну и показываем диалог с вопросом, как-нибудь так:

Все. Именно на этой странице (а если она первая в «стэке», то и для последующих сработает), при нажатии на кнопку «назад» будет проверяться, а есть ли нам куда возвращаться и будет задан вопрос о необходимости выхода, если экран самый первый в «дереве» и возвращаться некуда.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *