Закрытие диалогового окна с помощью клавиши 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 чтобы закрыть диалог.

Другие вопросы по тегам