Столкнулся тут на одном проекте с тем, что озвученный на большинстве ресурсов 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();
}
Ну и показываем диалог с вопросом, как-нибудь так:
Все. Именно на этой странице (а если она первая в «стэке», то и для последующих сработает), при нажатии на кнопку «назад» будет проверяться, а есть ли нам куда возвращаться и будет задан вопрос о необходимости выхода, если экран самый первый в «дереве» и возвращаться некуда.