Закрытие диалогового окна с помощью клавиши Escape с вложенным навигатором
Я пишу приложение Flutter, ориентированное на macOS, и хочу иметь возможность отображать модальное диалоговое окно, позволяющее осуществлять навигацию внутри этого диалогового окна (что-то вроде последовательности экранов подключения).
Чтобы облегчить навигацию в диалоговом окне, мне нужно обернуть мои виджеты в какой-то навигатор. См. Следующий (упрощенный) код:
showDialog(
context: context,
builder: (context) => Dialog(
child: SizedBox(
width: 400,
height: 400,
child: Navigator(
onGenerateRoute: (_) => MaterialPageRoute(
builder: (_) => const Center(child: Text('hi there'))
),
),
),
),
);
Теперь это работает отлично - кроме увольнения. Я могу закрыть диалоговое окно, коснувшись области барьера (что хорошо), однако нажатие ESC на клавиатуре не закрывает диалоговое окно.
Если я просто вставляю ребенка напрямую (без навигатора), нажатие ESC полностью закрывает диалоговое окно. Но почему-то похоже
Navigator
глотает клавишу ESC. Я также пробовал использовать
MaterialApp
как навигатор и еще кушает клавишу ESC.
Есть ли теории о том, как я могу заставить навигатор разрешить мне закрыть диалог с помощью клавиши ESC? Спасибо
1 ответ
Попробуйте обернуть виджет внутри маршрута страницы (в данном случае
Center
) с
WillPopScope
. Вы должны иметь возможность получать событие ESC на
onWillPop
обратный вызов до того, как его получит внутренний, тогда вы можете позвонить
pop
на внешнем
Navigator
чтобы закрыть диалог.